同步操作将从 OpenHarmony-SIG/python 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
"""Interface to the compiler's internal symbol tables"""import _symtablefrom _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):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, filenameobj = 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_tableself._filename = filenameself._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):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"assert self._table.type in (1, 2, 3), \"unexpected type: {0}".format(self._table.type)def get_id(self):return self._table.iddef get_name(self):return self._table.namedef get_lineno(self):return self._table.linenodef is_optimized(self):return bool(self._table.type == _symtable.TYPE_FUNCTION)def is_nested(self):return bool(self._table.nested)def has_children(self):return bool(self._table.children)def has_exec(self):"""Return true if the scope uses exec. Deprecated method."""return Falsedef get_identifiers(self):return self._table.symbols.keys()def lookup(self, name):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 symdef get_symbols(self):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.childrenif st.name == name]def get_children(self):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 = Nonedef __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):if self.__params is None:self.__params = self.__idents_matching(lambda x:x & DEF_PARAM)return self.__paramsdef get_locals(self):if self.__locals is None:locs = (LOCAL, CELL)test = lambda x: ((x >> SCOPE_OFF) & SCOPE_MASK) in locsself.__locals = self.__idents_matching(test)return self.__localsdef get_globals(self):if self.__globals is None:glob = (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT)test = lambda x:((x >> SCOPE_OFF) & SCOPE_MASK) in globself.__globals = self.__idents_matching(test)return self.__globalsdef get_nonlocals(self):if self.__nonlocals is None:self.__nonlocals = self.__idents_matching(lambda x:x & DEF_NONLOCAL)return self.__nonlocalsdef get_frees(self):if self.__frees is None:is_free = lambda x:((x >> SCOPE_OFF) & SCOPE_MASK) == FREEself.__frees = self.__idents_matching(is_free)return self.__freesclass Class(SymbolTable):__methods = Nonedef get_methods(self):if self.__methods is None:d = {}for st in self._table.children:d[st.name] = 1self.__methods = tuple(d)return self.__methodsclass Symbol:def __init__(self, name, flags, namespaces=None, *, module_scope=False):self.__name = nameself.__flags = flagsself.__scope = (flags >> SCOPE_OFF) & SCOPE_MASK # like PyST_GetScope()self.__namespaces = namespaces or ()self.__module_scope = module_scopedef __repr__(self):return "<symbol {0!r}>".format(self.__name)def get_name(self):return self.__namedef is_referenced(self):return bool(self.__flags & _symtable.USE)def is_parameter(self):return bool(self.__flags & DEF_PARAM)def is_global(self):"""Return *True* if the sysmbol 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 bool(self.__flags & DEF_NONLOCAL)def is_declared_global(self):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 bool(self.__flags & DEF_ANNOT)def is_free(self):return bool(self.__scope == FREE)def is_imported(self):return bool(self.__flags & DEF_IMPORT)def is_assigned(self):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 classstatement, this will be true.Note that a single name can be bound to multiple objects. Ifis_namespace() is true, the name may also be bound to otherobjects, like an int or list, that does not introduce a newnamespace."""return bool(self.__namespaces)def get_namespaces(self):"""Return a list of namespaces bound to this name"""return self.__namespacesdef get_namespace(self):"""Returns the single namespace bound to this name.Raises ValueError if the name is bound to multiple namespaces."""if len(self.__namespaces) != 1:raise ValueError("name is bound to multiple namespaces")return self.__namespaces[0]if __name__ == "__main__":import os, syswith 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())
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。