Skip to main content

32.3. symtable —访问编译器的符号表

源代码: Lib/symtable.py


符号表由编译器在生成字节码之前由AST生成。符号表负责计算代码中每个标识符的范围。 symtable 提供了一个接口来检查这些表。

32.3.1. 生成符号表

symtable.symtable(code, filename, compile_type)

返回Python源代码 code 的toplevel SymbolTablefilename 是包含代码的文件的名称。 compile_type 就像 compile()mode 参数。

32.3.2. 检查符号表

class 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。这些可以用 get_children() 获得。

has_exec()

如果块使用 exec,则返回 True

get_identifiers()

返回此表中的符号名称列表。

lookup(name)

在表中查找 name 并返回一个 Symbol 实例。

get_symbols()

返回表中名称的 Symbol 实例的列表。

get_children()

返回嵌套符号表的列表。

class symtable.Function

函数或方法的命名空间。这个类继承 SymbolTable

get_parameters()

将包含参数名称的元组返回到此函数。

get_locals()

在此函数中返回包含本地人名称的元组。

get_globals()

在此函数中返回包含全局变量名称的元组。

get_frees()

返回一个包含该函数中自由变量名称的元组。

class symtable.Class

类的命名空间。这个类继承 SymbolTable

get_methods()

返回一个包含类中声明的方法名称的元组。

class symtable.Symbol

SymbolTable 中对应于源中的标识符的条目。构造函数不是公共的。

get_name()

返回符号的名称。

is_referenced()

如果在其块中使用符号,则返回 True

is_imported()

如果符号是从import语句创建的,则返回 True

is_parameter()

如果符号是参数,则返回 True

is_global()

如果符号是全局的,则返回 True

is_declared_global()

如果使用全局语句将该符号声明为全局,则返回 True

is_local()

如果符号对其块是本地的,则返回 True

is_free()

如果符号在其块中引用,但未分配给,则返回 True

is_assigned()

如果在其块中分配了符号,则返回 True

is_namespace()

如果名称绑定引入新的命名空间,则返回 True

如果将该名称用作函数或类语句的目标,则为true。

例如:

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

请注意,单个名称可以绑定到多个对象。如果结果是 True,该名称也可以绑定到其他对象,如int或list,不引入新的命名空间。

get_namespaces()

返回绑定到此名称的命名空间的列表。

get_namespace()

返回绑定到此名称的命名空间。如果绑定了多个命名空间,则会引发 ValueError