32.3. symtable — 访问编译器的符号表 — Python 文档
32.3. 对称的 — 访问编译器的符号表
源代码: :source:`Lib/symtable.py`
符号表由编译器在生成字节码之前从 AST 生成。 符号表负责计算代码中每个标识符的范围。 symtable 提供了一个接口来检查这些表。
32.3.1. 生成符号表
- symtable.symtable(code, filename, compile_type)
- 返回 Python 源代码 代码 的顶层 SymbolTable。 filename 是包含代码的文件的名称。 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
。
- has_import_star()
如果块使用带星号的 from-import,则返回
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()
如果符号是从导入语句创建的,则返回
True
。
- is_parameter()
如果符号是参数,则返回
True
。
- is_global()
如果符号是全局的,则返回
True
。
- is_declared_global()
如果使用 global 语句将符号声明为全局,则返回
True
。
- is_local()
如果符号是其块的局部符号,则返回
True
。
- 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
。