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() 讀取。

get_identifiers()?

返回符號表中的符號名列表。

lookup(name)?

在符號表中查找 name 并返回一個 Symbol 實例。

get_symbols()?

返回符號表中所有符號的 Symbol 實例的列表。

get_children()?

返回嵌套符號表的列表。

class symtable.Function?

函數(shù)或方法的命名空間。該類繼承自 SymbolTable。

get_parameters()?

返回由函數(shù)的參數(shù)名組成的元組。

get_locals()?

返回函數(shù)中局部變量名組成的元組。

get_globals()?

返回函數(shù)中全局變量名組成的元組。

get_nonlocals()?

返回函數(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_nonlocal()?

如果符號為非局部變量,則返回 True

is_declared_global()?

如果符號用 global 聲明為全局變量,則返回 True。

is_local()?

如果符號是代碼塊內的局部變量,則返回 True。

is_annotated()?

如果符號帶有注解,則返回 True

3.6 新版功能.

is_free()?

如果符號在代碼塊中被引用,但未賦值,則返回 True。

is_assigned()?

如果符號在代碼塊中賦值,則返回 True。

is_namespace()?

如果符號名綁定引入了新的命名空間,則返回 True。

如果符號名用于函數(shù)或類定義語句,則為 True。

例如:

>>>
>>> table = symtable.symtable("def some_func(): pass", "string", "exec")
>>> table.lookup("some_func").is_namespace()
True

注意,一個符號名可以與多個對象綁定。如果結果為 True,則該符號名還可以綁定到其他對象上,比如 int 或 list ,且不會引入新的命名空間。

get_namespaces()?

返回與符號名綁定的命名空間的列表。

get_namespace()?

Return the namespace bound to this name. If more than one or no namespace is bound to this name, a ValueError is raised.