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