golden hour
/opt/alt/python37/lib64/python3.7
⬆️ Go Up
Upload
File/Folder
Size
Actions
__future__.py
4.98 KB
Del
OK
__phello__.foo.py
64 B
Del
OK
__pycache__
-
Del
OK
_bootlocale.py
1.76 KB
Del
OK
_collections_abc.py
25.8 KB
Del
OK
_compat_pickle.py
8.54 KB
Del
OK
_compression.py
5.21 KB
Del
OK
_dummy_thread.py
5.89 KB
Del
OK
_markupbase.py
14.26 KB
Del
OK
_osx_support.py
19.14 KB
Del
OK
_py_abc.py
6.04 KB
Del
OK
_pydecimal.py
223.33 KB
Del
OK
_pyio.py
89.47 KB
Del
OK
_sitebuiltins.py
3.04 KB
Del
OK
_strptime.py
24.91 KB
Del
OK
_sysconfigdata_dm_linux_x86_64-linux-gnu.py
26.36 KB
Del
OK
_sysconfigdata_m_linux_x86_64-linux-gnu.py
25 KB
Del
OK
_threading_local.py
7.04 KB
Del
OK
_weakrefset.py
5.55 KB
Del
OK
abc.py
5.45 KB
Del
OK
aifc.py
32.04 KB
Del
OK
antigravity.py
477 B
Del
OK
argparse.py
93.14 KB
Del
OK
ast.py
12.54 KB
Del
OK
asynchat.py
11.06 KB
Del
OK
asyncio
-
Del
OK
asyncore.py
19.65 KB
Del
OK
base64.py
19.92 KB
Del
OK
bdb.py
30.99 KB
Del
OK
binhex.py
13.63 KB
Del
OK
bisect.py
2.5 KB
Del
OK
bz2.py
12.12 KB
Del
OK
cProfile.py
6.11 KB
Del
OK
calendar.py
24.24 KB
Del
OK
cgi.py
34.23 KB
Del
OK
cgitb.py
11.74 KB
Del
OK
chunk.py
5.31 KB
Del
OK
cmd.py
14.51 KB
Del
OK
code.py
10.37 KB
Del
OK
codecs.py
35.76 KB
Del
OK
codeop.py
6.13 KB
Del
OK
collections
-
Del
OK
colorsys.py
3.97 KB
Del
OK
compileall.py
13.46 KB
Del
OK
concurrent
-
Del
OK
config-3.7m
-
Del
OK
configparser.py
53.01 KB
Del
OK
contextlib.py
24.18 KB
Del
OK
contextvars.py
129 B
Del
OK
copy.py
8.65 KB
Del
OK
copyreg.py
6.85 KB
Del
OK
crypt.py
3.27 KB
Del
OK
csv.py
15.8 KB
Del
OK
ctypes
-
Del
OK
curses
-
Del
OK
dataclasses.py
48.36 KB
Del
OK
datetime.py
84.52 KB
Del
OK
dbm
-
Del
OK
decimal.py
320 B
Del
OK
difflib.py
82.42 KB
Del
OK
dis.py
19.42 KB
Del
OK
distutils
-
Del
OK
doctest.py
102.11 KB
Del
OK
dummy_threading.py
2.75 KB
Del
OK
email
-
Del
OK
encodings
-
Del
OK
ensurepip
-
Del
OK
enum.py
34.22 KB
Del
OK
filecmp.py
9.6 KB
Del
OK
fileinput.py
14.28 KB
Del
OK
fnmatch.py
3.96 KB
Del
OK
formatter.py
14.79 KB
Del
OK
fractions.py
23.2 KB
Del
OK
ftplib.py
34.78 KB
Del
OK
functools.py
32.16 KB
Del
OK
genericpath.py
4.8 KB
Del
OK
getopt.py
7.31 KB
Del
OK
getpass.py
5.85 KB
Del
OK
gettext.py
21.45 KB
Del
OK
glob.py
5.51 KB
Del
OK
gzip.py
20.15 KB
Del
OK
hashlib.py
9.31 KB
Del
OK
heapq.py
22.48 KB
Del
OK
hmac.py
6.36 KB
Del
OK
html
-
Del
OK
http
-
Del
OK
idlelib
-
Del
OK
imaplib.py
52.04 KB
Del
OK
imghdr.py
3.71 KB
Del
OK
imp.py
10.29 KB
Del
OK
importlib
-
Del
OK
inspect.py
114.88 KB
Del
OK
io.py
3.43 KB
Del
OK
ipaddress.py
71.85 KB
Del
OK
json
-
Del
OK
keyword.py
2.2 KB
Del
OK
lib-dynload
-
Del
OK
lib2to3
-
Del
OK
linecache.py
5.21 KB
Del
OK
locale.py
76.36 KB
Del
OK
logging
-
Del
OK
lzma.py
12.68 KB
Del
OK
macpath.py
5.98 KB
Del
OK
mailbox.py
76.81 KB
Del
OK
mailcap.py
8.85 KB
Del
OK
mimetypes.py
20.99 KB
Del
OK
modulefinder.py
22.5 KB
Del
OK
multiprocessing
-
Del
OK
netrc.py
5.44 KB
Del
OK
nntplib.py
42.08 KB
Del
OK
ntpath.py
21.82 KB
Del
OK
nturl2path.py
2.52 KB
Del
OK
numbers.py
10 KB
Del
OK
opcode.py
5.69 KB
Del
OK
operator.py
10.61 KB
Del
OK
optparse.py
58.96 KB
Del
OK
os.py
37.01 KB
Del
OK
pathlib.py
49.15 KB
Del
OK
pdb.py
61.04 KB
Del
OK
pickle.py
56.63 KB
Del
OK
pickletools.py
89.08 KB
Del
OK
pipes.py
8.71 KB
Del
OK
pkgutil.py
20.96 KB
Del
OK
platform.py
45.89 KB
Del
OK
plistlib.py
29.99 KB
Del
OK
poplib.py
14.61 KB
Del
OK
posixpath.py
15.4 KB
Del
OK
pprint.py
20.39 KB
Del
OK
profile.py
21.97 KB
Del
OK
pstats.py
26.67 KB
Del
OK
pty.py
4.65 KB
Del
OK
py_compile.py
7.81 KB
Del
OK
pyclbr.py
14.78 KB
Del
OK
pydoc.py
103.39 KB
Del
OK
pydoc_data
-
Del
OK
queue.py
11.09 KB
Del
OK
quopri.py
7.09 KB
Del
OK
random.py
26.91 KB
Del
OK
re.py
14.95 KB
Del
OK
reprlib.py
5.14 KB
Del
OK
rlcompleter.py
6.93 KB
Del
OK
runpy.py
11.68 KB
Del
OK
sched.py
6.29 KB
Del
OK
secrets.py
1.99 KB
Del
OK
selectors.py
18.13 KB
Del
OK
shelve.py
8.33 KB
Del
OK
shlex.py
12.79 KB
Del
OK
shutil.py
40.97 KB
Del
OK
signal.py
2.07 KB
Del
OK
site-packages
-
Del
OK
site.py
21.07 KB
Del
OK
smtpd.py
33.91 KB
Del
OK
smtplib.py
43.4 KB
Del
OK
sndhdr.py
6.92 KB
Del
OK
socket.py
26.83 KB
Del
OK
socketserver.py
26.29 KB
Del
OK
sqlite3
-
Del
OK
sre_compile.py
26.24 KB
Del
OK
sre_constants.py
7.01 KB
Del
OK
sre_parse.py
38.24 KB
Del
OK
ssl.py
44.43 KB
Del
OK
stat.py
5.26 KB
Del
OK
statistics.py
20.17 KB
Del
OK
string.py
11.29 KB
Del
OK
stringprep.py
12.61 KB
Del
OK
struct.py
257 B
Del
OK
subprocess.py
70.95 KB
Del
OK
sunau.py
17.94 KB
Del
OK
symbol.py
2.09 KB
Del
OK
symtable.py
7.11 KB
Del
OK
sysconfig.py
23.87 KB
Del
OK
tabnanny.py
11.15 KB
Del
OK
tarfile.py
90.5 KB
Del
OK
telnetlib.py
22.59 KB
Del
OK
tempfile.py
26.1 KB
Del
OK
test
-
Del
OK
textwrap.py
18.95 KB
Del
OK
this.py
1003 B
Del
OK
threading.py
48.13 KB
Del
OK
timeit.py
13.18 KB
Del
OK
token.py
3.67 KB
Del
OK
tokenize.py
26.4 KB
Del
OK
trace.py
28.23 KB
Del
OK
traceback.py
22.89 KB
Del
OK
tracemalloc.py
16.68 KB
Del
OK
tty.py
879 B
Del
OK
types.py
9.67 KB
Del
OK
typing.py
55.12 KB
Del
OK
unittest
-
Del
OK
urllib
-
Del
OK
uu.py
7.11 KB
Del
OK
uuid.py
28.83 KB
Del
OK
venv
-
Del
OK
warnings.py
19.61 KB
Del
OK
wave.py
17.8 KB
Del
OK
weakref.py
21 KB
Del
OK
webbrowser.py
23.16 KB
Del
OK
wsgiref
-
Del
OK
xdrlib.py
5.77 KB
Del
OK
xml
-
Del
OK
xmlrpc
-
Del
OK
zipapp.py
7.36 KB
Del
OK
zipfile.py
79.19 KB
Del
OK
Edit: pyclbr.py
"""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; 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. 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 io import sys import importlib.util import tokenize from token import NAME, DEDENT, OP __all__ = ["readmodule", "readmodule_ex", "Class", "Function"] _modules = {} # Initialize cache of modules we've seen. class _Object: "Informaton about Python class or function." def __init__(self, module, name, file, lineno, parent): self.module = module self.name = name self.file = file self.lineno = lineno self.parent = parent self.children = {} def _addchild(self, name, obj): self.children[name] = obj class Function(_Object): "Information about a Python function, including methods." def __init__(self, module, name, file, lineno, parent=None): _Object.__init__(self, module, name, file, lineno, parent) class Class(_Object): "Information about a Python class." def __init__(self, module, name, super, file, lineno, parent=None): _Object.__init__(self, module, name, file, lineno, parent) self.super = [] if super is None else super self.methods = {} def _addmethod(self, name, lineno): self.methods[name] = lineno def _nest_function(ob, func_name, lineno): "Return a Function after nesting within ob." newfunc = Function(ob.module, func_name, ob.file, lineno, ob) ob._addchild(func_name, newfunc) if isinstance(ob, Class): ob._addmethod(func_name, lineno) return newfunc def _nest_class(ob, class_name, lineno, super=None): "Return a Class after nesting within ob." newclass = Class(ob.module, class_name, super, ob.file, lineno, ob) ob._addchild(class_name, newclass) return newclass 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) _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) if source is None: return tree except (AttributeError, ImportError): # If module is not Python source, we cannot do anything. return tree fname = spec.loader.get_filename(fullmodule) return _create_tree(fullmodule, path, fname, source, tree, inpackage) def _create_tree(fullmodule, path, fname, source, tree, inpackage): """Return the tree for a particular module. fullmodule (full module name), inpackage+module, becomes o.module. path is passed to recursive calls of _readmodule. fname becomes o.file. source is tokenized. Imports cause recursive calls to _readmodule. tree is {} or {'__path__': <submodule search locations>}. inpackage, None or string, is passed to recursive calls of _readmodule. The effect of recursive calls is mutation of global _modules. """ f = io.StringIO(source) stack = [] # Initialize 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 previous 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, func_name, start = next(g)[0:3] if tokentype != NAME: continue # Skip def with syntax error. cur_func = None if stack: cur_obj = stack[-1][0] cur_func = _nest_function(cur_obj, func_name, lineno) else: # It is just a function. cur_func = Function(fullmodule, func_name, fname, lineno) tree[func_name] = cur_func stack.append((cur_func, thisindent)) 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 # Skip class with syntax error. # Parse what follows the class name. tokentype, token, start = next(g)[0:3] inherit = None if token == '(': names = [] # Initialize 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 tree: # We know this super class. n = tree[n] else: c = n.split('.') if len(c) > 1: # Super class form is 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 if stack: cur_obj = stack[-1][0] cur_class = _nest_class( cur_obj, class_name, lineno, inherit) else: cur_class = Class(fullmodule, class_name, inherit, fname, lineno) tree[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: tree[n2 or n] = d[n] elif n == '*': # Don't add names that start with _. for n in d: if n[0] != '_': tree[n] = d[n] except StopIteration: pass f.close() return tree def _getnamelist(g): """Return list of (dotted-name, as-name or None) tuples for token source g. An as-name is the name that follows 'as' in an 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): "Return (dotted-name or None, next-token) tuple for token source g." 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(): "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()
Save