symtable ——訪問編譯器的符號表?
Source code: Lib/symtable.py
符號表由編譯器在生成字節(jié)碼之前根據(jù) AST 生成。符號表負責計算代碼中每個標識符的作用域。 symtable 提供了一個查看這些表的接口。
符號表的生成?
-
symtable.symtable(code, filename, compile_type)? 返回 Python 源 代碼 頂層的
SymbolTable。filename 是代碼文件名。 compile_type 的含義類似compile()的 mode 參數(shù)。
符號表的查看?
-
class
symtable.SymbolTable? 某個代碼塊的命名空間表。構造函數(shù)不公開。
-
get_type()? 返回符號表的類型??赡苁?
'class'、'module'或'function'。
-
get_id()? 返回符號表的標識符
-
get_name()? 返回符號表的名稱。 若為類的符號表則返回類名;若為函數(shù)的符號表則為函數(shù)名;若是全局符號表則為
'top'(get_type()返回'module')。
-
get_lineno()? 返回符號表所代表的代碼塊中第一行的編號。
-
is_optimized()? 如果符號表中的局部變量可能被優(yōu)化過,則返回
True。
-
is_nested()? 如果代碼塊是嵌套類或函數(shù),則返回
True。
-
has_children()? 如果代碼塊中有嵌套的命名空間,則返回
True??赏ㄟ^get_children()讀取。
-
has_exec()? Return
Trueif the block usesexec.
-
get_identifiers()? 返回符號表中的符號名列表。
-
get_children()? 返回嵌套符號表的列表。
-
-
class
symtable.Function? 函數(shù)或方法的命名空間。該類繼承自
SymbolTable。-
get_parameters()? 返回由函數(shù)的參數(shù)名組成的元組。
-
get_locals()? 返回函數(shù)中局部變量名組成的元組。
-
get_globals()? 返回函數(shù)中全局變量名組成的元組。
-
get_frees()? 返回函數(shù)中自由變量名組成的元組。
-
-
class
symtable.Class? 類的命名空間。繼承自
SymbolTable。-
get_methods()? 返回類中聲明的方法名組成的元組。
-
-
class
symtable.Symbol? SymbolTable中的數(shù)據(jù)項,對應于源碼中的某個標識符。構造函數(shù)不公開。-
get_name()? 返回符號名
-
is_referenced()? 如果符號在代碼塊中被引用了,則返回
True。
-
is_imported()? 如果符號是由導入語句創(chuàng)建的,則返回
True。
-
is_parameter()? 如果符號是參數(shù),返回
True。
-
is_global()? 如果符號是全局變量,則返回
True。
-
is_declared_global()? 如果符號用 global 聲明為全局變量,則返回
True。
-
is_local()? 如果符號在代碼塊內(nèi)是局部變量,則返回
True。
-
is_free()? 如果符號在代碼塊中被引用,但未賦值,則返回
True。
-
is_assigned()? 如果符號在代碼塊中賦值,則返回
True。
-
is_namespace()? 如果符號名綁定引入了新的命名空間,則返回
True。如果符號名用于 function 或 class 語句,則為 True。
例如
>>> table = symtable.symtable("def some_func(): pass", "string", "exec") >>> table.lookup("some_func").is_namespace() True
注意,一個符號名可以與多個對象綁定。如果結果為
True,則該符號名還可以綁定到其他對象上,比如 int 或 list ,且不會引入新的命名空間。
-
get_namespaces()? 返回與符號名綁定的命名空間的列表。
-
get_namespace()? 返回與符號名綁定的命名空間。如果綁定的命名空間超過一個,則會觸發(fā)
ValueError。
-
