404

[ Avaa Bypassed ]




Upload:

Command:

elspacio@3.144.254.149: ~ $
"""Parse a Python module and describe its classes and methods.

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

The interface consists of a single function:
        readmodule_ex(module [, path])
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 defined in the module (including classes that are defined
via the from XXX import YYY construct).  The values are class
instances of the class Class defined here.  One special key/value pair
is present for packages: the key '__path__' has a list as its value
which contains the package search path.

A class is described by the class Class in this module.  Instances
of this class have the following instance variables:
        module -- the module name
        name -- the name of the class
        super -- a list of super classes (Class instances)
        methods -- a dictionary of methods
        file -- the file in which the class was defined
        lineno -- the line in the file on which the class statement occurred
The dictionary of methods uses the method names as keys and the line
numbers on which the method was defined as values.
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.

A function is described by the class Function in this module.
Instances of this class have the following instance variables:
        module -- the module name
        name -- the name of the class
        file -- the file in which the class was defined
        lineno -- the line in the file on which the class statement occurred
"""

import io
import sys
import importlib.util
import tokenize
from token import NAME, DEDENT, OP

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

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

# each Python class is represented by an instance of this class
class Class:
    '''Class to represent a Python class.'''
    def __init__(self, module, name, super, file, lineno):
        self.module = module
        self.name = name
        if super is None:
            super = []
        self.super = super
        self.methods = {}
        self.file = file
        self.lineno = lineno

    def _addmethod(self, name, lineno):
        self.methods[name] = lineno

class Function:
    '''Class to represent a top-level Python function'''
    def __init__(self, module, name, file, lineno):
        self.module = module
        self.name = name
        self.file = file
        self.lineno = lineno

def readmodule(module, path=None):
    '''Backwards compatible interface.

    Call readmodule_ex() and then only keep Class objects from the
    resulting dictionary.'''

    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):
    '''Read a module file and return a dictionary of classes.

    Search for MODULE in PATH and sys.path, read and parse the
    module and return a dictionary with one entry for each class
    found in the module.
    '''
    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
    dict = {}

    # 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] = dict
        return dict

    # 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
    # XXX This will change once issue19944 lands.
    spec = importlib.util._find_spec_from_path(fullmodule, search_path)
    _modules[fullmodule] = dict
    # is module a package?
    if spec.submodule_search_locations is not None:
        dict['__path__'] = spec.submodule_search_locations
    try:
        source = spec.loader.get_source(fullmodule)
        if source is None:
            return dict
    except (AttributeError, ImportError):
        # not Python source, can't do anything with this module
        return dict

    fname = spec.loader.get_filename(fullmodule)

    f = io.StringIO(source)

    stack = [] # stack of (class, indent) pairs

    g = tokenize.generate_tokens(f.readline)
    try:
        for tokentype, token, start, _end, _line in g:
            if tokentype == DEDENT:
                lineno, thisindent = start
                # close nested classes and defs
                while stack and stack[-1][1] >= thisindent:
                    del stack[-1]
            elif token == 'def':
                lineno, thisindent = start
                # close previous nested classes and defs
                while stack and stack[-1][1] >= thisindent:
                    del stack[-1]
                tokentype, meth_name, start = next(g)[0:3]
                if tokentype != NAME:
                    continue # Syntax error
                if stack:
                    cur_class = stack[-1][0]
                    if isinstance(cur_class, Class):
                        # it's a method
                        cur_class._addmethod(meth_name, lineno)
                    # else it's a nested def
                else:
                    # it's a function
                    dict[meth_name] = Function(fullmodule, meth_name,
                                               fname, lineno)
                stack.append((None, thisindent)) # Marker for nested fns
            elif token == 'class':
                lineno, thisindent = start
                # close previous nested classes and defs
                while stack and stack[-1][1] >= thisindent:
                    del stack[-1]
                tokentype, class_name, start = next(g)[0:3]
                if tokentype != NAME:
                    continue # Syntax error
                # parse what follows the class name
                tokentype, token, start = next(g)[0:3]
                inherit = None
                if token == '(':
                    names = [] # List of superclasses
                    # there's a list of superclasses
                    level = 1
                    super = [] # Tokens making up current superclass
                    while True:
                        tokentype, token, start = next(g)[0:3]
                        if token in (')', ',') and level == 1:
                            n = "".join(super)
                            if n in dict:
                                # we know this super class
                                n = dict[n]
                            else:
                                c = n.split('.')
                                if len(c) > 1:
                                    # super class is of the form
                                    # module.class: look in module for
                                    # class
                                    m = c[-2]
                                    c = c[-1]
                                    if m in _modules:
                                        d = _modules[m]
                                        if c in d:
                                            n = d[c]
                            names.append(n)
                            super = []
                        if token == '(':
                            level += 1
                        elif token == ')':
                            level -= 1
                            if level == 0:
                                break
                        elif token == ',' and level == 1:
                            pass
                        # only use NAME and OP (== dot) tokens for type name
                        elif tokentype in (NAME, OP) and level == 1:
                            super.append(token)
                        # expressions in the base list are not supported
                    inherit = names
                cur_class = Class(fullmodule, class_name, inherit,
                                  fname, lineno)
                if not stack:
                    dict[class_name] = cur_class
                stack.append((cur_class, thisindent))
            elif token == 'import' and start[1] == 0:
                modules = _getnamelist(g)
                for mod, _mod2 in modules:
                    try:
                        # Recursively read the imported module
                        if inpackage is None:
                            _readmodule(mod, path)
                        else:
                            try:
                                _readmodule(mod, path, inpackage)
                            except ImportError:
                                _readmodule(mod, [])
                    except:
                        # If we can't find or parse the imported module,
                        # too bad -- don't die here.
                        pass
            elif token == 'from' and start[1] == 0:
                mod, token = _getname(g)
                if not mod or token != "import":
                    continue
                names = _getnamelist(g)
                try:
                    # Recursively read the imported module
                    d = _readmodule(mod, path, inpackage)
                except:
                    # If we can't find or parse the imported module,
                    # too bad -- don't die here.
                    continue
                # add any classes that were defined in the imported module
                # to our name space if they were mentioned in the list
                for n, n2 in names:
                    if n in d:
                        dict[n2 or n] = d[n]
                    elif n == '*':
                        # don't add names that start with _
                        for n in d:
                            if n[0] != '_':
                                dict[n] = d[n]
    except StopIteration:
        pass

    f.close()
    return dict

def _getnamelist(g):
    # Helper to get a comma-separated list of dotted names plus 'as'
    # clauses.  Return a list of pairs (name, name2) where name2 is
    # the 'as' name, or None if there is no 'as' clause.
    names = []
    while True:
        name, token = _getname(g)
        if not name:
            break
        if token == 'as':
            name2, token = _getname(g)
        else:
            name2 = None
        names.append((name, name2))
        while token != "," and "\n" not in token:
            token = next(g)[1]
        if token != ",":
            break
    return names

def _getname(g):
    # Helper to get a dotted name, return a pair (name, token) where
    # name is the dotted name, or None if there was no dotted name,
    # and token is the next input token.
    parts = []
    tokentype, token = next(g)[0:2]
    if tokentype != NAME and token != '*':
        return (None, token)
    parts.append(token)
    while True:
        tokentype, token = next(g)[0:2]
        if token != '.':
            break
        tokentype, token = next(g)[0:2]
        if tokentype != NAME:
            break
        parts.append(token)
    return (".".join(parts), token)

def _main():
    # Main program for testing.
    import os
    from operator import itemgetter
    mod = sys.argv[1]
    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 = []
    dict = readmodule_ex(mod, path)
    objs = list(dict.values())
    objs.sort(key=lambda a: getattr(a, 'lineno', 0))
    for obj in objs:
        if isinstance(obj, Class):
            print("class", obj.name, obj.super, obj.lineno)
            methods = sorted(obj.methods.items(), key=itemgetter(1))
            for name, lineno in methods:
                if name != "__path__":
                    print("  def", name, lineno)
        elif isinstance(obj, Function):
            print("def", 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.6m-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
test Folder 0755
unittest Folder 0755
urllib Folder 0755
venv Folder 0755
wsgiref Folder 0755
xml Folder 0755
xmlrpc Folder 0755
__future__.py File 4.73 KB 0644
__phello__.foo.py File 64 B 0644
_bootlocale.py File 1.27 KB 0644
_collections_abc.py File 25.77 KB 0644
_compat_pickle.py File 8.54 KB 0644
_compression.py File 5.21 KB 0644
_dummy_thread.py File 5 KB 0644
_markupbase.py File 14.26 KB 0644
_osx_support.py File 18.69 KB 0644
_pydecimal.py File 224.83 KB 0644
_pyio.py File 86.03 KB 0644
_sitebuiltins.py File 3.04 KB 0644
_strptime.py File 24.17 KB 0644
_sysconfigdata_dm_linux_x86_64-linux-gnu.py File 29.48 KB 0644
_sysconfigdata_m_linux_x86_64-linux-gnu.py File 29.66 KB 0644
_threading_local.py File 7.04 KB 0644
_weakrefset.py File 5.57 KB 0644
abc.py File 8.52 KB 0644
aifc.py File 31.69 KB 0644
antigravity.py File 477 B 0644
argparse.py File 88.25 KB 0644
ast.py File 11.88 KB 0644
asynchat.py File 11.06 KB 0644
asyncore.py File 19.69 KB 0644
base64.py File 19.91 KB 0755
bdb.py File 23 KB 0644
binhex.py File 13.63 KB 0644
bisect.py File 2.53 KB 0644
bz2.py File 12.19 KB 0644
cProfile.py File 5.25 KB 0755
calendar.py File 22.67 KB 0644
cgi.py File 36.35 KB 0755
cgitb.py File 11.74 KB 0644
chunk.py File 5.3 KB 0644
cmd.py File 14.51 KB 0644
code.py File 10.37 KB 0644
codecs.py File 35.43 KB 0644
codeop.py File 5.85 KB 0644
colorsys.py File 3.97 KB 0644
compileall.py File 11.84 KB 0644
configparser.py File 52.34 KB 0644
contextlib.py File 12.85 KB 0644
copy.py File 8.61 KB 0644
copyreg.py File 6.84 KB 0644
crypt.py File 1.82 KB 0644
csv.py File 15.8 KB 0644
datetime.py File 80.11 KB 0644
decimal.py File 320 B 0644
difflib.py File 82.4 KB 0644
dis.py File 17.71 KB 0644
doctest.py File 101.94 KB 0644
dummy_threading.py File 2.75 KB 0644
enum.py File 32.82 KB 0644
filecmp.py File 9.6 KB 0644
fileinput.py File 14.13 KB 0644
fnmatch.py File 3.09 KB 0644
formatter.py File 14.79 KB 0644
fractions.py File 23.08 KB 0644
ftplib.py File 34.78 KB 0644
functools.py File 30.61 KB 0644
genericpath.py File 4.64 KB 0644
getopt.py File 7.31 KB 0644
getpass.py File 5.85 KB 0644
gettext.py File 21.03 KB 0644
glob.py File 5.51 KB 0644
gzip.py File 19.86 KB 0644
hashlib.py File 8.59 KB 0644
heapq.py File 22.39 KB 0644
hmac.py File 6.23 KB 0644
imaplib.py File 52.05 KB 0644
imghdr.py File 3.71 KB 0644
imp.py File 10.42 KB 0644
inspect.py File 114.22 KB 0644
io.py File 3.43 KB 0644
ipaddress.py File 75.99 KB 0644
keyword.py File 2.17 KB 0755
linecache.py File 5.19 KB 0644
locale.py File 75.49 KB 0644
lzma.py File 12.68 KB 0644
macpath.py File 5.83 KB 0644
macurl2path.py File 2.67 KB 0644
mailbox.py File 76.78 KB 0644
mailcap.py File 8.85 KB 0644
mimetypes.py File 20.55 KB 0644
modulefinder.py File 22.49 KB 0644
netrc.py File 5.55 KB 0644
nntplib.py File 42.07 KB 0644
ntpath.py File 22.55 KB 0644
nturl2path.py File 2.39 KB 0644
numbers.py File 10 KB 0644
opcode.py File 5.69 KB 0644
operator.py File 10.61 KB 0644
optparse.py File 58.96 KB 0644
os.py File 36.65 KB 0644
pathlib.py File 47.83 KB 0644
pdb.py File 59.88 KB 0755
pickle.py File 54.39 KB 0644
pickletools.py File 89.62 KB 0644
pipes.py File 8.71 KB 0644
pkgutil.py File 20.82 KB 0644
platform.py File 46.11 KB 0755
plistlib.py File 31.53 KB 0644
poplib.py File 14.61 KB 0644
posixpath.py File 15.4 KB 0644
pprint.py File 20.37 KB 0644
profile.py File 21.51 KB 0755
pstats.py File 25.94 KB 0644
pty.py File 4.65 KB 0644
py_compile.py File 7.01 KB 0644
pyclbr.py File 13.24 KB 0644
pydoc.py File 101.08 KB 0644
queue.py File 8.57 KB 0644
quopri.py File 7.09 KB 0755
random.py File 26.8 KB 0644
re.py File 15.19 KB 0644
reprlib.py File 5.21 KB 0644
rlcompleter.py File 6.93 KB 0644
runpy.py File 11.68 KB 0644
sched.py File 6.36 KB 0644
secrets.py File 1.99 KB 0644
selectors.py File 18.98 KB 0644
shelve.py File 8.32 KB 0644
shlex.py File 12.65 KB 0644
shutil.py File 39.87 KB 0644
signal.py File 2.07 KB 0644
site.py File 20.77 KB 0644
smtpd.py File 33.91 KB 0755
smtplib.py File 43.18 KB 0755
sndhdr.py File 6.92 KB 0644
socket.py File 26.8 KB 0644
socketserver.py File 26.38 KB 0644
sre_compile.py File 18.88 KB 0644
sre_constants.py File 6.66 KB 0644
sre_parse.py File 35.68 KB 0644
ssl.py File 43.47 KB 0644
stat.py File 4.92 KB 0644
statistics.py File 20.19 KB 0644
string.py File 11.52 KB 0644
stringprep.py File 12.61 KB 0644
struct.py File 257 B 0644
subprocess.py File 60.88 KB 0644
sunau.py File 17.67 KB 0644
symbol.py File 2.07 KB 0755
symtable.py File 7.11 KB 0644
sysconfig.py File 24.29 KB 0644
tabnanny.py File 11.14 KB 0755
tarfile.py File 104.88 KB 0755
telnetlib.py File 22.59 KB 0644
tempfile.py File 27.41 KB 0644
textwrap.py File 19.1 KB 0644
this.py File 1003 B 0644
threading.py File 48.96 KB 0644
timeit.py File 13.03 KB 0755
token.py File 3 KB 0644
tokenize.py File 28.8 KB 0644
trace.py File 28.06 KB 0755
traceback.py File 22.91 KB 0644
tracemalloc.py File 16.27 KB 0644
tty.py File 879 B 0644
types.py File 8.66 KB 0644
typing.py File 78.39 KB 0644
uu.py File 6.6 KB 0755
uuid.py File 23.46 KB 0644
warnings.py File 18.05 KB 0644
wave.py File 17.29 KB 0644
weakref.py File 19.99 KB 0644
webbrowser.py File 21.26 KB 0755
xdrlib.py File 5.77 KB 0644
zipapp.py File 6.99 KB 0644
zipfile.py File 78.05 KB 0644