symtable
——訪問編譯器的符號表?
Source code: Lib/symtable.py
符號表由編譯器在生成字節(jié)碼之前根據(jù) AST 生成。符號表負(fù)責(zé)計(jì)算代碼中每個(gè)標(biāo)識符的作用域。 symtable
提供了一個(gè)查看這些表的接口。
符號表的生成?
- symtable.symtable(code, filename, compile_type)?
返回 Python 源 代碼 頂層的
SymbolTable
。filename 是代碼文件名。 compile_type 的含義類似compile()
的 mode 參數(shù)。
符號表的查看?
- class symtable.SymbolTable?
某個(gè)代碼塊的命名空間表。構(gòu)造函數(shù)不公開。
- get_type()?
返回符號表的類型??赡苁?
'class'
、'module'
或'function'
。
- get_id()?
返回符號表的標(biāo)識符
- 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()?
返回符號表中的符號名列表。
- 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ù)項(xiàng),對應(yīng)于源碼中的某個(gè)標(biāo)識符。構(gòu)造函數(shù)不公開。- get_name()?
返回符號名
- is_referenced()?
如果符號在代碼塊中被引用了,則返回
True
。
- is_imported()?
如果符號是由導(dǎo)入語句創(chuàng)建的,則返回
True
。
- is_parameter()?
如果符號是參數(shù),返回
True
。
- is_global()?
如果符號是全局變量,則返回
True
。
- is_nonlocal()?
如果符號為非局部變量,則返回
True
。
- is_declared_global()?
如果符號用 global 聲明為全局變量,則返回
True
。
- is_local()?
如果符號是代碼塊內(nèi)的局部變量,則返回
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
注意,一個(gè)符號名可以與多個(gè)對象綁定。如果結(jié)果為
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.