Linux business57.web-hosting.com 4.18.0-553.lve.el8.x86_64 #1 SMP Mon May 27 15:27:34 UTC 2024 x86_64
LiteSpeed
Server IP : 199.188.201.191 & Your IP : 3.141.40.192
Domains :
Cant Read [ /etc/named.conf ]
User : derozboy
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
opt /
alt /
python312 /
lib64 /
python3.12 /
Delete
Unzip
Name
Size
Permission
Date
Action
__pycache__
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
asyncio
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
collections
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
concurrent
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
config-3.12-x86_64-linux-gnu
[ DIR ]
drwxr-xr-x
2025-04-01 08:43
ctypes
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
curses
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
dbm
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
email
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
encodings
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
ensurepip
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
html
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
http
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
importlib
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
json
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
lib-dynload
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
lib2to3
[ DIR ]
drwxr-xr-x
2025-04-01 08:45
logging
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
multiprocessing
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
pydoc_data
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
re
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
site-packages
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
sqlite3
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
tomllib
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
unittest
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
urllib
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
venv
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
wsgiref
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
xml
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
xmlrpc
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
zipfile
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
zoneinfo
[ DIR ]
drwxr-xr-x
2025-04-01 08:39
LICENSE.txt
13.61
KB
-rw-r--r--
2025-02-04 14:38
__future__.py
5.1
KB
-rw-r--r--
2025-03-03 16:34
__hello__.py
227
B
-rw-r--r--
2025-03-03 16:34
_aix_support.py
3.93
KB
-rw-r--r--
2025-03-03 16:34
_collections_abc.py
31.34
KB
-rw-r--r--
2025-03-03 16:34
_compat_pickle.py
8.56
KB
-rw-r--r--
2025-03-03 16:34
_compression.py
5.55
KB
-rw-r--r--
2025-03-03 16:34
_markupbase.py
14.31
KB
-rw-r--r--
2025-03-03 16:34
_osx_support.py
21.51
KB
-rw-r--r--
2025-03-03 16:34
_py_abc.py
6.04
KB
-rw-r--r--
2025-03-03 16:34
_pydatetime.py
90
KB
-rw-r--r--
2025-03-03 16:34
_pydecimal.py
221.96
KB
-rw-r--r--
2025-03-03 16:34
_pyio.py
91.4
KB
-rw-r--r--
2025-03-03 16:34
_pylong.py
10.54
KB
-rw-r--r--
2025-03-03 16:34
_sitebuiltins.py
3.05
KB
-rw-r--r--
2025-03-03 16:34
_strptime.py
27.73
KB
-rw-r--r--
2025-03-03 16:34
_sysconfigdata__linux_x86_64-linux-gnu.py
74.64
KB
-rw-r--r--
2025-03-03 16:41
_sysconfigdata_d_linux_x86_64-linux-gnu.py
74.64
KB
-rw-r--r--
2025-03-03 16:36
_threading_local.py
7.05
KB
-rw-r--r--
2025-03-03 16:34
_weakrefset.py
5.75
KB
-rw-r--r--
2025-03-03 16:34
abc.py
6.38
KB
-rw-r--r--
2025-03-03 16:34
aifc.py
33.41
KB
-rw-r--r--
2025-03-03 16:34
antigravity.py
500
B
-rw-r--r--
2025-03-03 16:34
argparse.py
98.78
KB
-rw-r--r--
2025-03-03 16:34
ast.py
62.94
KB
-rw-r--r--
2025-03-03 16:34
base64.py
20.16
KB
-rwxr-xr-x
2025-03-03 16:34
bdb.py
32.79
KB
-rw-r--r--
2025-03-03 16:34
bisect.py
3.34
KB
-rw-r--r--
2025-03-03 16:34
bz2.py
11.57
KB
-rw-r--r--
2025-03-03 16:34
cProfile.py
6.42
KB
-rwxr-xr-x
2025-03-03 16:34
calendar.py
25.26
KB
-rw-r--r--
2025-03-03 16:34
cgi.py
33.63
KB
-rwxr-xr-x
2025-03-03 16:34
cgitb.py
12.13
KB
-rw-r--r--
2025-03-03 16:34
chunk.py
5.37
KB
-rw-r--r--
2025-03-03 16:34
cmd.py
14.52
KB
-rw-r--r--
2025-03-03 16:34
code.py
10.71
KB
-rw-r--r--
2025-03-03 16:34
codecs.py
36.01
KB
-rw-r--r--
2025-03-03 16:34
codeop.py
5.77
KB
-rw-r--r--
2025-03-03 16:34
colorsys.py
3.97
KB
-rw-r--r--
2025-03-03 16:34
compileall.py
20.03
KB
-rw-r--r--
2025-03-03 16:34
configparser.py
52.53
KB
-rw-r--r--
2025-03-03 16:34
contextlib.py
26.99
KB
-rw-r--r--
2025-03-03 16:34
contextvars.py
129
B
-rw-r--r--
2025-03-03 16:34
copy.py
8.21
KB
-rw-r--r--
2025-03-03 16:34
copyreg.py
7.44
KB
-rw-r--r--
2025-03-03 16:34
crypt.py
3.82
KB
-rw-r--r--
2025-03-03 16:34
csv.py
16
KB
-rw-r--r--
2025-03-03 16:34
dataclasses.py
60.63
KB
-rw-r--r--
2025-03-03 16:34
datetime.py
268
B
-rw-r--r--
2025-03-03 16:34
decimal.py
2.74
KB
-rw-r--r--
2025-03-03 16:34
difflib.py
81.36
KB
-rw-r--r--
2025-03-03 16:34
dis.py
29.52
KB
-rw-r--r--
2025-03-03 16:34
doctest.py
104.25
KB
-rw-r--r--
2025-03-03 16:34
enum.py
79.53
KB
-rw-r--r--
2025-03-03 16:34
filecmp.py
10.14
KB
-rw-r--r--
2025-03-03 16:34
fileinput.py
15.35
KB
-rw-r--r--
2025-03-03 16:34
fnmatch.py
5.86
KB
-rw-r--r--
2025-03-03 16:34
fractions.py
37.25
KB
-rw-r--r--
2025-03-03 16:34
ftplib.py
33.92
KB
-rw-r--r--
2025-03-03 16:34
functools.py
37.05
KB
-rw-r--r--
2025-03-03 16:34
genericpath.py
5.18
KB
-rw-r--r--
2025-03-03 16:34
getopt.py
7.31
KB
-rw-r--r--
2025-03-03 16:34
getpass.py
5.85
KB
-rw-r--r--
2025-03-03 16:34
gettext.py
20.82
KB
-rw-r--r--
2025-03-03 16:34
glob.py
8.53
KB
-rw-r--r--
2025-03-03 16:34
graphlib.py
9.43
KB
-rw-r--r--
2025-03-03 16:34
gzip.py
24.28
KB
-rw-r--r--
2025-03-03 16:34
hashlib.py
9.13
KB
-rw-r--r--
2025-03-03 16:34
heapq.py
22.48
KB
-rw-r--r--
2025-03-03 16:34
hmac.py
7.54
KB
-rw-r--r--
2025-03-03 16:34
imaplib.py
52.77
KB
-rw-r--r--
2025-03-03 16:34
imghdr.py
4.29
KB
-rw-r--r--
2025-03-03 16:34
inspect.py
123.94
KB
-rw-r--r--
2025-03-03 16:34
io.py
3.5
KB
-rw-r--r--
2025-03-03 16:34
ipaddress.py
77.27
KB
-rw-r--r--
2025-03-03 16:34
keyword.py
1.05
KB
-rw-r--r--
2025-03-03 16:34
linecache.py
5.66
KB
-rw-r--r--
2025-03-03 16:34
locale.py
76.76
KB
-rw-r--r--
2025-03-03 16:34
lzma.py
12.97
KB
-rw-r--r--
2025-03-03 16:34
mailbox.py
77.06
KB
-rw-r--r--
2025-03-03 16:34
mailcap.py
9.11
KB
-rw-r--r--
2025-03-03 16:34
mimetypes.py
22.42
KB
-rw-r--r--
2025-03-03 16:34
modulefinder.py
23.14
KB
-rw-r--r--
2025-03-03 16:34
netrc.py
6.76
KB
-rw-r--r--
2025-03-03 16:34
nntplib.py
40.12
KB
-rw-r--r--
2025-03-03 16:34
ntpath.py
31.11
KB
-rw-r--r--
2025-03-03 16:34
nturl2path.py
2.32
KB
-rw-r--r--
2025-03-03 16:34
numbers.py
11.2
KB
-rw-r--r--
2025-03-03 16:34
opcode.py
12.87
KB
-rw-r--r--
2025-03-03 16:34
operator.py
10.71
KB
-rw-r--r--
2025-03-03 16:34
optparse.py
58.95
KB
-rw-r--r--
2025-03-03 16:34
os.py
39.82
KB
-rw-r--r--
2025-03-03 16:34
pathlib.py
49.86
KB
-rw-r--r--
2025-03-03 16:34
pdb.py
68.66
KB
-rwxr-xr-x
2025-03-03 16:34
pickle.py
65.34
KB
-rw-r--r--
2025-03-03 16:34
pickletools.py
91.85
KB
-rw-r--r--
2025-03-03 16:34
pipes.py
8.77
KB
-rw-r--r--
2025-03-03 16:34
pkgutil.py
17.85
KB
-rw-r--r--
2025-03-03 16:34
platform.py
42.38
KB
-rwxr-xr-x
2025-03-03 16:34
plistlib.py
27.68
KB
-rw-r--r--
2025-03-03 16:34
poplib.py
13.87
KB
-rw-r--r--
2025-03-03 16:34
posixpath.py
16.89
KB
-rw-r--r--
2025-03-03 16:34
pprint.py
23.59
KB
-rw-r--r--
2025-03-03 16:34
profile.py
22.56
KB
-rwxr-xr-x
2025-03-03 16:34
pstats.py
28.6
KB
-rw-r--r--
2025-03-03 16:34
pty.py
5.99
KB
-rw-r--r--
2025-03-03 16:34
py_compile.py
7.65
KB
-rw-r--r--
2025-03-03 16:34
pyclbr.py
11.13
KB
-rw-r--r--
2025-03-03 16:34
pydoc.py
110.83
KB
-rwxr-xr-x
2025-03-03 16:34
queue.py
11.23
KB
-rw-r--r--
2025-03-03 16:34
quopri.py
7.03
KB
-rwxr-xr-x
2025-03-03 16:34
random.py
33.87
KB
-rw-r--r--
2025-03-03 16:34
reprlib.py
6.98
KB
-rw-r--r--
2025-03-03 16:34
rlcompleter.py
7.64
KB
-rw-r--r--
2025-03-03 16:34
runpy.py
12.58
KB
-rw-r--r--
2025-03-03 16:34
sched.py
6.2
KB
-rw-r--r--
2025-03-03 16:34
secrets.py
1.94
KB
-rw-r--r--
2025-03-03 16:34
selectors.py
19.21
KB
-rw-r--r--
2025-03-03 16:34
shelve.py
8.36
KB
-rw-r--r--
2025-03-03 16:34
shlex.py
13.04
KB
-rw-r--r--
2025-03-03 16:34
shutil.py
55.43
KB
-rw-r--r--
2025-03-03 16:34
signal.py
2.44
KB
-rw-r--r--
2025-03-03 16:34
site.py
22.65
KB
-rw-r--r--
2025-03-03 16:34
smtplib.py
42.52
KB
-rwxr-xr-x
2025-03-03 16:34
sndhdr.py
7.27
KB
-rw-r--r--
2025-03-03 16:34
socket.py
36.93
KB
-rw-r--r--
2025-03-03 16:34
socketserver.py
27.41
KB
-rw-r--r--
2025-03-03 16:34
sre_compile.py
231
B
-rw-r--r--
2025-03-03 16:34
sre_constants.py
232
B
-rw-r--r--
2025-03-03 16:34
sre_parse.py
229
B
-rw-r--r--
2025-03-03 16:34
ssl.py
49.71
KB
-rw-r--r--
2025-03-03 16:34
stat.py
5.36
KB
-rw-r--r--
2025-03-03 16:34
statistics.py
49.05
KB
-rw-r--r--
2025-03-03 16:34
string.py
11.51
KB
-rw-r--r--
2025-03-03 16:34
stringprep.py
12.61
KB
-rw-r--r--
2025-03-03 16:34
struct.py
257
B
-rw-r--r--
2025-03-03 16:34
subprocess.py
87.12
KB
-rw-r--r--
2025-03-03 16:34
sunau.py
18.04
KB
-rw-r--r--
2025-03-03 16:34
symtable.py
12.18
KB
-rw-r--r--
2025-03-03 16:34
sysconfig.py
30.93
KB
-rw-r--r--
2025-03-03 16:34
tabnanny.py
11.27
KB
-rwxr-xr-x
2025-03-03 16:34
tarfile.py
105.96
KB
-rwxr-xr-x
2025-03-03 16:34
telnetlib.py
22.79
KB
-rw-r--r--
2025-03-03 16:34
tempfile.py
31.48
KB
-rw-r--r--
2025-03-03 16:34
textwrap.py
19.26
KB
-rw-r--r--
2025-03-03 16:34
this.py
1003
B
-rw-r--r--
2025-03-03 16:34
threading.py
58.79
KB
-rw-r--r--
2025-03-03 16:34
timeit.py
13.16
KB
-rwxr-xr-x
2025-03-03 16:34
token.py
2.45
KB
-rw-r--r--
2025-03-03 16:34
tokenize.py
20.6
KB
-rw-r--r--
2025-03-03 16:34
trace.py
28.68
KB
-rwxr-xr-x
2025-03-03 16:34
traceback.py
45.24
KB
-rw-r--r--
2025-03-03 16:34
tracemalloc.py
17.62
KB
-rw-r--r--
2025-03-03 16:34
tty.py
1.99
KB
-rw-r--r--
2025-03-03 16:34
types.py
10.74
KB
-rw-r--r--
2025-03-03 16:34
typing.py
116.05
KB
-rw-r--r--
2025-03-03 16:34
uu.py
7.17
KB
-rw-r--r--
2025-03-03 16:42
uuid.py
28.96
KB
-rw-r--r--
2025-03-03 16:34
warnings.py
21.39
KB
-rw-r--r--
2025-03-03 16:34
wave.py
22.24
KB
-rw-r--r--
2025-03-03 16:34
weakref.py
21.01
KB
-rw-r--r--
2025-03-03 16:34
webbrowser.py
23.19
KB
-rwxr-xr-x
2025-03-03 16:34
xdrlib.py
5.8
KB
-rw-r--r--
2025-03-03 16:34
zipapp.py
7.37
KB
-rw-r--r--
2025-03-03 16:34
zipimport.py
27.19
KB
-rw-r--r--
2025-03-03 16:34
Save
Rename
"""Interface to the compiler's internal symbol tables""" import _symtable from _symtable import (USE, DEF_GLOBAL, DEF_NONLOCAL, DEF_LOCAL, DEF_PARAM, DEF_IMPORT, DEF_BOUND, DEF_ANNOT, SCOPE_OFF, SCOPE_MASK, FREE, LOCAL, GLOBAL_IMPLICIT, GLOBAL_EXPLICIT, CELL) import weakref __all__ = ["symtable", "SymbolTable", "Class", "Function", "Symbol"] def symtable(code, filename, compile_type): """ Return the toplevel *SymbolTable* for the source code. *filename* is the name of the file with the code and *compile_type* is the *compile()* mode argument. """ top = _symtable.symtable(code, filename, compile_type) return _newSymbolTable(top, filename) class SymbolTableFactory: def __init__(self): self.__memo = weakref.WeakValueDictionary() def new(self, table, filename): if table.type == _symtable.TYPE_FUNCTION: return Function(table, filename) if table.type == _symtable.TYPE_CLASS: return Class(table, filename) return SymbolTable(table, filename) def __call__(self, table, filename): key = table, filename obj = self.__memo.get(key, None) if obj is None: obj = self.__memo[key] = self.new(table, filename) return obj _newSymbolTable = SymbolTableFactory() class SymbolTable: def __init__(self, raw_table, filename): self._table = raw_table self._filename = filename self._symbols = {} def __repr__(self): if self.__class__ == SymbolTable: kind = "" else: kind = "%s " % self.__class__.__name__ if self._table.name == "top": return "<{0}SymbolTable for module {1}>".format(kind, self._filename) else: return "<{0}SymbolTable for {1} in {2}>".format(kind, self._table.name, self._filename) def get_type(self): """Return the type of the symbol table. The values returned are 'class', 'module', 'function', 'annotation', 'TypeVar bound', 'type alias', and 'type parameter'. """ if self._table.type == _symtable.TYPE_MODULE: return "module" if self._table.type == _symtable.TYPE_FUNCTION: return "function" if self._table.type == _symtable.TYPE_CLASS: return "class" if self._table.type == _symtable.TYPE_ANNOTATION: return "annotation" if self._table.type == _symtable.TYPE_TYPE_VAR_BOUND: return "TypeVar bound" if self._table.type == _symtable.TYPE_TYPE_ALIAS: return "type alias" if self._table.type == _symtable.TYPE_TYPE_PARAM: return "type parameter" assert False, f"unexpected type: {self._table.type}" def get_id(self): """Return an identifier for the table. """ return self._table.id def get_name(self): """Return the table's name. This corresponds to the name of the class, function or 'top' if the table is for a class, function or global respectively. """ return self._table.name def get_lineno(self): """Return the number of the first line in the block for the table. """ return self._table.lineno def is_optimized(self): """Return *True* if the locals in the table are optimizable. """ return bool(self._table.type == _symtable.TYPE_FUNCTION) def is_nested(self): """Return *True* if the block is a nested class or function.""" return bool(self._table.nested) def has_children(self): """Return *True* if the block has nested namespaces. """ return bool(self._table.children) def get_identifiers(self): """Return a view object containing the names of symbols in the table. """ return self._table.symbols.keys() def lookup(self, name): """Lookup a *name* in the table. Returns a *Symbol* instance. """ sym = self._symbols.get(name) if sym is None: flags = self._table.symbols[name] namespaces = self.__check_children(name) module_scope = (self._table.name == "top") sym = self._symbols[name] = Symbol(name, flags, namespaces, module_scope=module_scope) return sym def get_symbols(self): """Return a list of *Symbol* instances for names in the table. """ return [self.lookup(ident) for ident in self.get_identifiers()] def __check_children(self, name): return [_newSymbolTable(st, self._filename) for st in self._table.children if st.name == name] def get_children(self): """Return a list of the nested symbol tables. """ return [_newSymbolTable(st, self._filename) for st in self._table.children] class Function(SymbolTable): # Default values for instance variables __params = None __locals = None __frees = None __globals = None __nonlocals = None def __idents_matching(self, test_func): return tuple(ident for ident in self.get_identifiers() if test_func(self._table.symbols[ident])) def get_parameters(self): """Return a tuple of parameters to the function. """ if self.__params is None: self.__params = self.__idents_matching(lambda x:x & DEF_PARAM) return self.__params def get_locals(self): """Return a tuple of locals in the function. """ if self.__locals is None: locs = (LOCAL, CELL) test = lambda x: ((x >> SCOPE_OFF) & SCOPE_MASK) in locs self.__locals = self.__idents_matching(test) return self.__locals def get_globals(self): """Return a tuple of globals in the function. """ if self.__globals is None: glob = (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT) test = lambda x:((x >> SCOPE_OFF) & SCOPE_MASK) in glob self.__globals = self.__idents_matching(test) return self.__globals def get_nonlocals(self): """Return a tuple of nonlocals in the function. """ if self.__nonlocals is None: self.__nonlocals = self.__idents_matching(lambda x:x & DEF_NONLOCAL) return self.__nonlocals def get_frees(self): """Return a tuple of free variables in the function. """ if self.__frees is None: is_free = lambda x:((x >> SCOPE_OFF) & SCOPE_MASK) == FREE self.__frees = self.__idents_matching(is_free) return self.__frees class Class(SymbolTable): __methods = None def get_methods(self): """Return a tuple of methods declared in the class. """ if self.__methods is None: d = {} def is_local_symbol(ident): flags = self._table.symbols.get(ident, 0) return ((flags >> SCOPE_OFF) & SCOPE_MASK) == LOCAL for st in self._table.children: # pick the function-like symbols that are local identifiers if is_local_symbol(st.name): match st.type: case _symtable.TYPE_FUNCTION: # generators are of type TYPE_FUNCTION with a ".0" # parameter as a first parameter (which makes them # distinguishable from a function named 'genexpr') if st.name == 'genexpr' and '.0' in st.varnames: continue d[st.name] = 1 case _symtable.TYPE_TYPE_PARAM: # Get the function-def block in the annotation # scope 'st' with the same identifier, if any. scope_name = st.name for c in st.children: if c.name == scope_name and c.type == _symtable.TYPE_FUNCTION: # A generic generator of type TYPE_FUNCTION # cannot be a direct child of 'st' (but it # can be a descendant), e.g.: # # class A: # type genexpr[genexpr] = (x for x in []) assert scope_name != 'genexpr' or '.0' not in c.varnames d[scope_name] = 1 break self.__methods = tuple(d) return self.__methods class Symbol: def __init__(self, name, flags, namespaces=None, *, module_scope=False): self.__name = name self.__flags = flags self.__scope = (flags >> SCOPE_OFF) & SCOPE_MASK # like PyST_GetScope() self.__namespaces = namespaces or () self.__module_scope = module_scope def __repr__(self): return "<symbol {0!r}>".format(self.__name) def get_name(self): """Return a name of a symbol. """ return self.__name def is_referenced(self): """Return *True* if the symbol is used in its block. """ return bool(self.__flags & _symtable.USE) def is_parameter(self): """Return *True* if the symbol is a parameter. """ return bool(self.__flags & DEF_PARAM) def is_global(self): """Return *True* if the symbol is global. """ return bool(self.__scope in (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT) or (self.__module_scope and self.__flags & DEF_BOUND)) def is_nonlocal(self): """Return *True* if the symbol is nonlocal.""" return bool(self.__flags & DEF_NONLOCAL) def is_declared_global(self): """Return *True* if the symbol is declared global with a global statement.""" return bool(self.__scope == GLOBAL_EXPLICIT) def is_local(self): """Return *True* if the symbol is local. """ return bool(self.__scope in (LOCAL, CELL) or (self.__module_scope and self.__flags & DEF_BOUND)) def is_annotated(self): """Return *True* if the symbol is annotated. """ return bool(self.__flags & DEF_ANNOT) def is_free(self): """Return *True* if a referenced symbol is not assigned to. """ return bool(self.__scope == FREE) def is_imported(self): """Return *True* if the symbol is created from an import statement. """ return bool(self.__flags & DEF_IMPORT) def is_assigned(self): """Return *True* if a symbol is assigned to.""" return bool(self.__flags & DEF_LOCAL) def is_namespace(self): """Returns *True* if name binding introduces new namespace. If the name is used as the target of a function or class statement, this will be true. Note that a single name can be bound to multiple objects. If is_namespace() is true, the name may also be bound to other objects, like an int or list, that does not introduce a new namespace. """ return bool(self.__namespaces) def get_namespaces(self): """Return a list of namespaces bound to this name""" return self.__namespaces def get_namespace(self): """Return the single namespace bound to this name. Raises ValueError if the name is bound to multiple namespaces or no namespace. """ if len(self.__namespaces) == 0: raise ValueError("name is not bound to any namespaces") elif len(self.__namespaces) > 1: raise ValueError("name is bound to multiple namespaces") else: return self.__namespaces[0] if __name__ == "__main__": import os, sys with open(sys.argv[0]) as f: src = f.read() mod = symtable(src, os.path.split(sys.argv[0])[1], "exec") for ident in mod.get_identifiers(): info = mod.lookup(ident) print(info, info.is_local(), info.is_namespace())