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