404

[ Avaa Bypassed ]




Upload:

Command:

elspacio@3.147.73.9: ~ $
"""Parse a Python module and describe its classes and functions.

Parse enough of a Python file to recognize imports and class and
function definitions, and to find out the superclasses of a class.

The interface consists of a single function:
    readmodule_ex(module, path=None)
where module is the name of a Python module, and path is an optional
list of directories where the module is to be searched.  If present,
path is prepended to the system search path sys.path.  The return value
is a dictionary.  The keys of the dictionary are the names of the
classes and functions defined in the module (including classes that are
defined via the from XXX import YYY construct).  The values are
instances of classes Class and Function.  One special key/value pair is
present for packages: the key '__path__' has a list as its value which
contains the package search path.

Classes and Functions have a common superclass: _Object.  Every instance
has the following attributes:
    module  -- name of the module;
    name    -- name of the object;
    file    -- file in which the object is defined;
    lineno  -- line in the file where the object's definition starts;
    end_lineno -- line in the file where the object's definition ends;
    parent  -- parent of this object, if any;
    children -- nested objects contained in this object.
The 'children' attribute is a dictionary mapping names to objects.

Instances of Function describe functions with the attributes from _Object,
plus the following:
    is_async -- if a function is defined with an 'async' prefix

Instances of Class describe classes with the attributes from _Object,
plus the following:
    super   -- list of super classes (Class instances if possible);
    methods -- mapping of method names to beginning line numbers.
If the name of a super class is not recognized, the corresponding
entry in the list of super classes is not a class instance but a
string giving the name of the super class.  Since import statements
are recognized and imported modules are scanned as well, this
shouldn't happen often.
"""

import ast
import sys
import importlib.util

__all__ = ["readmodule", "readmodule_ex", "Class", "Function"]

_modules = {}  # Initialize cache of modules we've seen.


class _Object:
    "Information about Python class or function."
    def __init__(self, module, name, file, lineno, end_lineno, parent):
        self.module = module
        self.name = name
        self.file = file
        self.lineno = lineno
        self.end_lineno = end_lineno
        self.parent = parent
        self.children = {}
        if parent is not None:
            parent.children[name] = self


# Odd Function and Class signatures are for back-compatibility.
class Function(_Object):
    "Information about a Python function, including methods."
    def __init__(self, module, name, file, lineno,
                 parent=None, is_async=False, *, end_lineno=None):
        super().__init__(module, name, file, lineno, end_lineno, parent)
        self.is_async = is_async
        if isinstance(parent, Class):
            parent.methods[name] = lineno


class Class(_Object):
    "Information about a Python class."
    def __init__(self, module, name, super_, file, lineno,
                 parent=None, *, end_lineno=None):
        super().__init__(module, name, file, lineno, end_lineno, parent)
        self.super = super_ or []
        self.methods = {}


# These 2 functions are used in these tests
# Lib/test/test_pyclbr, Lib/idlelib/idle_test/test_browser.py
def _nest_function(ob, func_name, lineno, end_lineno, is_async=False):
    "Return a Function after nesting within ob."
    return Function(ob.module, func_name, ob.file, lineno,
                    parent=ob, is_async=is_async, end_lineno=end_lineno)

def _nest_class(ob, class_name, lineno, end_lineno, super=None):
    "Return a Class after nesting within ob."
    return Class(ob.module, class_name, super, ob.file, lineno,
                 parent=ob, end_lineno=end_lineno)


def readmodule(module, path=None):
    """Return Class objects for the top-level classes in module.

    This is the original interface, before Functions were added.
    """

    res = {}
    for key, value in _readmodule(module, path or []).items():
        if isinstance(value, Class):
            res[key] = value
    return res

def readmodule_ex(module, path=None):
    """Return a dictionary with all functions and classes in module.

    Search for module in PATH + sys.path.
    If possible, include imported superclasses.
    Do this by reading source, without importing (and executing) it.
    """
    return _readmodule(module, path or [])


def _readmodule(module, path, inpackage=None):
    """Do the hard work for readmodule[_ex].

    If inpackage is given, it must be the dotted name of the package in
    which we are searching for a submodule, and then PATH must be the
    package search path; otherwise, we are searching for a top-level
    module, and path is combined with sys.path.
    """
    # Compute the full module name (prepending inpackage if set).
    if inpackage is not None:
        fullmodule = "%s.%s" % (inpackage, module)
    else:
        fullmodule = module

    # Check in the cache.
    if fullmodule in _modules:
        return _modules[fullmodule]

    # Initialize the dict for this module's contents.
    tree = {}

    # Check if it is a built-in module; we don't do much for these.
    if module in sys.builtin_module_names and inpackage is None:
        _modules[module] = tree
        return tree

    # Check for a dotted module name.
    i = module.rfind('.')
    if i >= 0:
        package = module[:i]
        submodule = module[i+1:]
        parent = _readmodule(package, path, inpackage)
        if inpackage is not None:
            package = "%s.%s" % (inpackage, package)
        if not '__path__' in parent:
            raise ImportError('No package named {}'.format(package))
        return _readmodule(submodule, parent['__path__'], package)

    # Search the path for the module.
    f = None
    if inpackage is not None:
        search_path = path
    else:
        search_path = path + sys.path
    spec = importlib.util._find_spec_from_path(fullmodule, search_path)
    if spec is None:
        raise ModuleNotFoundError(f"no module named {fullmodule!r}", name=fullmodule)
    _modules[fullmodule] = tree
    # Is module a package?
    if spec.submodule_search_locations is not None:
        tree['__path__'] = spec.submodule_search_locations
    try:
        source = spec.loader.get_source(fullmodule)
    except (AttributeError, ImportError):
        # If module is not Python source, we cannot do anything.
        return tree
    else:
        if source is None:
            return tree

    fname = spec.loader.get_filename(fullmodule)
    return _create_tree(fullmodule, path, fname, source, tree, inpackage)


class _ModuleBrowser(ast.NodeVisitor):
    def __init__(self, module, path, file, tree, inpackage):
        self.path = path
        self.tree = tree
        self.file = file
        self.module = module
        self.inpackage = inpackage
        self.stack = []

    def visit_ClassDef(self, node):
        bases = []
        for base in node.bases:
            name = ast.unparse(base)
            if name in self.tree:
                # We know this super class.
                bases.append(self.tree[name])
            elif len(names := name.split(".")) > 1:
                # Super class form is module.class:
                # look in module for class.
                *_, module, class_ = names
                if module in _modules:
                    bases.append(_modules[module].get(class_, name))
            else:
                bases.append(name)

        parent = self.stack[-1] if self.stack else None
        class_ = Class(self.module, node.name, bases, self.file, node.lineno,
                       parent=parent, end_lineno=node.end_lineno)
        if parent is None:
            self.tree[node.name] = class_
        self.stack.append(class_)
        self.generic_visit(node)
        self.stack.pop()

    def visit_FunctionDef(self, node, *, is_async=False):
        parent = self.stack[-1] if self.stack else None
        function = Function(self.module, node.name, self.file, node.lineno,
                            parent, is_async, end_lineno=node.end_lineno)
        if parent is None:
            self.tree[node.name] = function
        self.stack.append(function)
        self.generic_visit(node)
        self.stack.pop()

    def visit_AsyncFunctionDef(self, node):
        self.visit_FunctionDef(node, is_async=True)

    def visit_Import(self, node):
        if node.col_offset != 0:
            return

        for module in node.names:
            try:
                try:
                    _readmodule(module.name, self.path, self.inpackage)
                except ImportError:
                    _readmodule(module.name, [])
            except (ImportError, SyntaxError):
                # If we can't find or parse the imported module,
                # too bad -- don't die here.
                continue

    def visit_ImportFrom(self, node):
        if node.col_offset != 0:
            return
        try:
            module = "." * node.level
            if node.module:
                module += node.module
            module = _readmodule(module, self.path, self.inpackage)
        except (ImportError, SyntaxError):
            return

        for name in node.names:
            if name.name in module:
                self.tree[name.asname or name.name] = module[name.name]
            elif name.name == "*":
                for import_name, import_value in module.items():
                    if import_name.startswith("_"):
                        continue
                    self.tree[import_name] = import_value


def _create_tree(fullmodule, path, fname, source, tree, inpackage):
    mbrowser = _ModuleBrowser(fullmodule, path, fname, tree, inpackage)
    mbrowser.visit(ast.parse(source))
    return mbrowser.tree


def _main():
    "Print module output (default this file) for quick visual check."
    import os
    try:
        mod = sys.argv[1]
    except:
        mod = __file__
    if os.path.exists(mod):
        path = [os.path.dirname(mod)]
        mod = os.path.basename(mod)
        if mod.lower().endswith(".py"):
            mod = mod[:-3]
    else:
        path = []
    tree = readmodule_ex(mod, path)
    lineno_key = lambda a: getattr(a, 'lineno', 0)
    objs = sorted(tree.values(), key=lineno_key, reverse=True)
    indent_level = 2
    while objs:
        obj = objs.pop()
        if isinstance(obj, list):
            # Value is a __path__ key.
            continue
        if not hasattr(obj, 'indent'):
            obj.indent = 0

        if isinstance(obj, _Object):
            new_objs = sorted(obj.children.values(),
                              key=lineno_key, reverse=True)
            for ob in new_objs:
                ob.indent = obj.indent + indent_level
            objs.extend(new_objs)
        if isinstance(obj, Class):
            print("{}class {} {} {}"
                  .format(' ' * obj.indent, obj.name, obj.super, obj.lineno))
        elif isinstance(obj, Function):
            print("{}def {} {}".format(' ' * obj.indent, obj.name, obj.lineno))

if __name__ == "__main__":
    _main()

Filemanager

Name Type Size Permission Actions
__pycache__ Folder 0755
asyncio Folder 0755
collections Folder 0755
concurrent Folder 0755
config-3.10-x86_64-linux-gnu Folder 0755
ctypes Folder 0755
curses Folder 0755
dbm Folder 0755
distutils Folder 0755
email Folder 0755
encodings Folder 0755
ensurepip Folder 0755
html Folder 0755
http Folder 0755
importlib Folder 0755
json Folder 0755
lib-dynload Folder 0755
lib2to3 Folder 0755
logging Folder 0755
multiprocessing Folder 0755
pydoc_data Folder 0755
site-packages Folder 0755
sqlite3 Folder 0755
unittest Folder 0755
urllib Folder 0755
venv Folder 0755
wsgiref Folder 0755
xml Folder 0755
xmlrpc Folder 0755
zoneinfo Folder 0755
LICENSE.txt File 13.61 KB 0644
__future__.py File 5.03 KB 0644
__phello__.foo.py File 64 B 0644
_aix_support.py File 3.19 KB 0644
_bootsubprocess.py File 2.61 KB 0644
_collections_abc.py File 31.53 KB 0644
_compat_pickle.py File 8.54 KB 0644
_compression.py File 5.55 KB 0644
_markupbase.py File 14.31 KB 0644
_osx_support.py File 21.28 KB 0644
_py_abc.py File 6.04 KB 0644
_pydecimal.py File 223.32 KB 0644
_pyio.py File 92.25 KB 0644
_sitebuiltins.py File 3.05 KB 0644
_strptime.py File 24.68 KB 0644
_sysconfigdata__linux_x86_64-linux-gnu.py File 40.38 KB 0644
_sysconfigdata_d_linux_x86_64-linux-gnu.py File 39.81 KB 0644
_threading_local.py File 7.05 KB 0644
_weakrefset.py File 5.78 KB 0644
abc.py File 6.37 KB 0644
aifc.py File 31.84 KB 0644
antigravity.py File 500 B 0644
argparse.py File 96.23 KB 0644
ast.py File 58.5 KB 0644
asynchat.py File 11.25 KB 0644
asyncore.py File 19.79 KB 0644
base64.py File 20.37 KB 0755
bdb.py File 31.64 KB 0644
binhex.py File 14.44 KB 0644
bisect.py File 3.06 KB 0644
bz2.py File 11.57 KB 0644
cProfile.py File 6.21 KB 0755
calendar.py File 24 KB 0644
cgi.py File 33.31 KB 0755
cgitb.py File 11.81 KB 0644
chunk.py File 5.31 KB 0644
cmd.py File 14.51 KB 0644
code.py File 10.37 KB 0644
codecs.py File 35.85 KB 0644
codeop.py File 5.48 KB 0644
colorsys.py File 3.92 KB 0644
compileall.py File 19.78 KB 0644
configparser.py File 53.33 KB 0644
contextlib.py File 25.28 KB 0644
contextvars.py File 129 B 0644
copy.py File 8.48 KB 0644
copyreg.py File 7.25 KB 0644
crypt.py File 3.76 KB 0644
csv.py File 15.65 KB 0644
dataclasses.py File 55.07 KB 0644
datetime.py File 86.02 KB 0644
decimal.py File 320 B 0644
difflib.py File 81.36 KB 0644
dis.py File 19.55 KB 0644
doctest.py File 102.68 KB 0644
enum.py File 38.9 KB 0644
filecmp.py File 9.94 KB 0644
fileinput.py File 16.06 KB 0644
fnmatch.py File 6.56 KB 0644
fractions.py File 27.58 KB 0644
ftplib.py File 34.66 KB 0644
functools.py File 37.18 KB 0644
genericpath.py File 4.86 KB 0644
getopt.py File 7.31 KB 0644
getpass.py File 5.85 KB 0644
gettext.py File 26.63 KB 0644
glob.py File 7.7 KB 0644
graphlib.py File 9.35 KB 0644
gzip.py File 21.34 KB 0644
hashlib.py File 9.99 KB 0644
heapq.py File 22.34 KB 0644
hmac.py File 7.54 KB 0644
imaplib.py File 53.58 KB 0644
imghdr.py File 3.72 KB 0644
imp.py File 10.34 KB 0644
inspect.py File 121.46 KB 0644
io.py File 4.1 KB 0644
ipaddress.py File 75.96 KB 0644
keyword.py File 1.04 KB 0644
linecache.py File 5.56 KB 0644
locale.py File 76.29 KB 0644
lzma.py File 12.97 KB 0644
mailbox.py File 76.95 KB 0644
mailcap.py File 8.9 KB 0644
mimetypes.py File 22.01 KB 0644
modulefinder.py File 23.83 KB 0644
netrc.py File 5.61 KB 0644
nntplib.py File 40.06 KB 0644
ntpath.py File 28.79 KB 0644
nturl2path.py File 2.82 KB 0644
numbers.py File 10.11 KB 0644
opcode.py File 5.76 KB 0644
operator.py File 10.5 KB 0644
optparse.py File 58.95 KB 0644
os.py File 38.63 KB 0644
pathlib.py File 48.41 KB 0644
pdb.py File 61.76 KB 0755
pickle.py File 63.43 KB 0644
pickletools.py File 91.29 KB 0644
pipes.py File 8.71 KB 0644
pkgutil.py File 24 KB 0644
platform.py File 41.05 KB 0755
plistlib.py File 27.69 KB 0644
poplib.py File 14.84 KB 0644
posixpath.py File 15.87 KB 0644
pprint.py File 23.87 KB 0644
profile.py File 22.36 KB 0755
pstats.py File 28.64 KB 0644
pty.py File 5.09 KB 0644
py_compile.py File 7.71 KB 0644
pyclbr.py File 11.13 KB 0644
pydoc.py File 107.03 KB 0755
queue.py File 11.23 KB 0644
quopri.py File 7.11 KB 0755
random.py File 32.44 KB 0644
re.py File 15.49 KB 0644
reprlib.py File 5.14 KB 0644
rlcompleter.py File 7.63 KB 0644
runpy.py File 12.8 KB 0644
sched.py File 6.2 KB 0644
secrets.py File 1.99 KB 0644
selectors.py File 19.08 KB 0644
shelve.py File 8.36 KB 0644
shlex.py File 13.18 KB 0644
shutil.py File 53.29 KB 0644
signal.py File 2.38 KB 0644
site.py File 22.39 KB 0644
smtpd.py File 34.35 KB 0755
smtplib.py File 44.37 KB 0755
sndhdr.py File 6.93 KB 0644
socket.py File 36.14 KB 0644
socketserver.py File 26.66 KB 0644
sre_compile.py File 27.32 KB 0644
sre_constants.py File 7.01 KB 0644
sre_parse.py File 39.82 KB 0644
ssl.py File 52.63 KB 0644
stat.py File 5.36 KB 0644
statistics.py File 42.19 KB 0644
string.py File 10.32 KB 0644
stringprep.py File 12.61 KB 0644
struct.py File 257 B 0644
subprocess.py File 82.93 KB 0644
sunau.py File 17.73 KB 0644
symtable.py File 9.98 KB 0644
sysconfig.py File 26.96 KB 0644
tabnanny.py File 11.05 KB 0755
tarfile.py File 105.13 KB 0755
telnetlib.py File 22.71 KB 0644
tempfile.py File 28.78 KB 0644
textwrap.py File 19.31 KB 0644
this.py File 1003 B 0644
threading.py File 55.41 KB 0644
timeit.py File 13.19 KB 0755
token.py File 2.33 KB 0644
tokenize.py File 25.31 KB 0644
trace.py File 28.54 KB 0755
traceback.py File 25.61 KB 0644
tracemalloc.py File 17.62 KB 0644
tty.py File 879 B 0644
types.py File 9.88 KB 0644
typing.py File 90.39 KB 0644
uu.py File 7.11 KB 0644
uuid.py File 26.86 KB 0644
warnings.py File 19.23 KB 0644
wave.py File 17.58 KB 0644
weakref.py File 21.05 KB 0644
webbrowser.py File 23.69 KB 0755
xdrlib.py File 5.77 KB 0644
zipapp.py File 7.36 KB 0644
zipfile.py File 88.09 KB 0644
zipimport.py File 30.17 KB 0644