symtable — 访问编译器的符号表 — Python 文档

来自菜鸟教程
Python/docs/3.9/library/symtable
跳转至:导航、​搜索

symtable — 访问编译器的符号表

源代码: :source:`Lib/symtable.py`



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

生成符号表

symtable.symtable(code, filename, compile_type)
返回 Python 源代码 代码 的顶层 SymbolTablefilename 是包含代码的文件的名称。 compile_type 就像 compile()mode 参数。


检查符号表

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() 获得。

get_identifiers()

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

lookup(name)

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

get_symbols()

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

get_children()

返回嵌套符号表的列表。

class symtable.Function

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

get_parameters()

返回一个包含参数名称的元组给这个函数。

get_locals()

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

get_globals()

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

get_nonlocals()

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

get_frees()

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

class symtable.Class
类的命名空间。 这个类继承了SymbolTable
get_methods()
返回一个包含在类中声明的方法名称的元组。
class symtable.Symbol

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

get_name()

返回符号的名称。

is_referenced()

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

is_imported()

如果符号是从导入语句创建的,则返回 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

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

例如:

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

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

get_namespaces()

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

get_namespace()

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