On this page
symtable —访问编译器的符号表
源代码: Lib/symtable.py
符号表是在字节码生成之前由编译器从 AST 生成的。符号表负责计算代码中每个标识符的范围。 symtable提供了一个界面来检查这些表。
生成符号表
symtable.symtable(* code , filename , compile_type *)- 返回顶层SymbolTable作为 Python 源* code *。 * filename *是包含代码的文件的名称。 * compile_type 类似于compile()的 mode *参数。
检查符号表
类别
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。
- 如果该块使用
get_identifiers( )- 返回此表中符号的名称列表。
lookup(* name *)- 在表中查找* name *并返回Symbol实例。
get_symbols( )- 返回表中名称的Symbol个实例列表。
get_children( )- 返回嵌套符号表的列表。
类别
symtable.Function- 函数或方法的名称空间。此类继承SymbolTable。
get_parameters( )- 将包含参数名称的 Tuples 返回到此函数。
get_locals( )- 在此函数中返回一个包含本地名称的 Tuples。
get_globals( )- 在此函数中返回一个包含全局名称的 Tuples。
get_nonlocals( )- 在此函数中返回一个包含 nonlocal 名称的 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_nonlocal( )- 如果符号不是本地符号,则返回
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。