On this page
32.3. symtable —访问编译器的符号表
源代码: Lib/symtable.py
符号表是在字节码生成之前由编译器从 AST 生成的。符号表负责计算代码中每个标识符的范围。 symtable提供了一个界面来检查这些表。
32.3.1. 生成符号表
symtable.
symtable
(* code , filename , compile_type *)- 返回顶层SymbolTable作为 Python 源* code *。 * filename *是包含代码的文件的名称。 * compile_type 类似于compile()的 mode *参数。
32.3.2. 检查符号表
类别
symtable.
SymbolTable
- 块的名称空间表。构造函数不是公共的。
get_type
( )- 返回符号表的类型。可能的值为
'class'
,'module'
和'function'
。
- 返回符号表的类型。可能的值为
get_id
( )- 返回表的标识符。
get_name
( )- 返回表的名称。如果表用于类,则为类的名称;如果表用于函数,则为函数的名称;如果表是全局的,则为
'top'
(get_type()返回'module'
)。
- 返回表的名称。如果表用于类,则为类的名称;如果表用于函数,则为函数的名称;如果表是全局的,则为
get_lineno
( )- 返回此表代表的块中第一行的编号。
is_optimized
( )- 如果可以优化此表中的本地人,则返回
True
。
- 如果可以优化此表中的本地人,则返回
is_nested
( )- 如果块是嵌套的类或函数,则返回
True
。
- 如果块是嵌套的类或函数,则返回
has_children
( )- 如果该块中包含嵌套的名称空间,则返回
True
。这些可以passget_children()获得。
- 如果该块中包含嵌套的名称空间,则返回
has_exec
( )- 如果该块使用
exec
,则返回True
。
- 如果该块使用
has_import_star
( )- 如果该块使用已加星标的从导入,则返回
True
。
- 如果该块使用已加星标的从导入,则返回
get_identifiers
( )- 返回此表中符号的名称列表。
lookup
(* name *)- 在表中查找* name *并返回Symbol实例。
get_symbols
( )- 返回表中名称的Symbol个实例列表。
get_children
( )- 返回嵌套符号表的列表。
类别
symtable.
Function
- 函数或方法的名称空间。此类继承SymbolTable。
get_parameters
( )- 将包含参数名称的 Tuples 返回到此函数。
get_locals
( )- 在此函数中返回一个包含本地名称的 Tuples。
get_globals
( )- 在此函数中返回一个包含全局名称的 Tuples。
get_frees
( )- 返回一个包含此函数中自由变量名称的 Tuples。
类别
symtable.
Class
- 类的名称空间。此类继承SymbolTable。
get_methods
( )- 返回一个包含在类中语句的方法名称的 Tuples。
类别
symtable.
Symbol
- SymbolTable中与源中的标识符相对应的条目。构造函数不是公共的。
get_name
( )- 返回符号的名称。
is_referenced
( )- 如果符号在其块中使用,则返回
True
。
- 如果符号在其块中使用,则返回
is_imported
( )- 如果符号是从导入语句创建的,则返回
True
。
- 如果符号是从导入语句创建的,则返回
is_parameter
( )- 如果符号是参数,则返回
True
。
- 如果符号是参数,则返回
is_global
( )- 如果符号是全局符号,则返回
True
。
- 如果符号是全局符号,则返回
is_declared_global
( )- 如果使用全局语句将符号语句为全局符号,则返回
True
。
- 如果使用全局语句将符号语句为全局符号,则返回
is_local
( )- 如果符号位于其块的本地,则返回
True
。
- 如果符号位于其块的本地,则返回
is_free
( )- 如果符号在其块中被引用但未被分配,则返回
True
。
- 如果符号在其块中被引用但未被分配,则返回
is_assigned
( )- 如果符号在其块中分配给,则返回
True
。
- 如果符号在其块中分配给,则返回
is_namespace
( )- 如果名称绑定引入了新的命名空间,则返回
True
。
- 如果名称绑定引入了新的命名空间,则返回
如果将该名称用作函数或类语句的目标,则为 true。
For example:
>>> table = symtable.symtable("def some_func(): pass", "string", "exec")
>>> table.lookup("some_func").is_namespace()
True
请注意,一个名称可以绑定到多个对象。如果结果为True
,则名称也可以绑定到其他对象,例如 int 或 list,这些对象不会引入新的名称空间。
get_namespaces
( )- 返回与此名称绑定的名称空间列表。
get_namespace
( )- 返回绑定到该名称的名称空间。如果绑定了多个名称空间,则会引发ValueError。