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


    符号表由编译器在生成字节码之前根据 AST 生成。符号表负责计算代码中每个标识符的作用域。 提供了一个查看这些表的接口。

    (code, filename, compile_type)

    返回 Python 源 代码 顶层的 SymbolTablefilename 是代码文件名。 compile_type 的含义类似 的 mode 参数。

    32.3.2. 符号表的查看

    class symtable.SymbolTable

    某个代码块的命名空间表。构造函数不公开。

    • get_type()

      返回符号表的类型。可能是 'class''module''function'

    • get_id()

      返回符号表的标识符

    • get_name()

      返回符号表的名称。 若为类的符号表则返回类名;若为函数的符号表则为函数名;若是全局符号表则为 'top' ( 返回 'module')。

    • get_lineno()

      返回符号表所代表的代码块中第一行的编号。

    • is_optimized()

      如果符号表中的局部变量可能被优化过,则返回 True

    • is_nested()

      如果代码块是嵌套类或函数,则返回 True

    • has_children()

      如果代码块中有嵌套的命名空间,则返回 True。可通过 get_children() 读取。

    • get_identifiers()

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

    • 在符号表中查找 name 并返回一个 实例。

    • get_symbols()

      返回符号表中所有符号的 Symbol 实例的列表。

    • get_children()

      返回嵌套符号表的列表。

    class symtable.Function

    函数或方法的命名空间。该类继承自 。

    • get_parameters()

      返回由函数的参数名组成的元组。

    • get_locals()

      返回函数中局部变量名组成的元组。

    • get_globals()

      返回函数中全局变量名组成的元组。

    • get_frees()

      返回函数中自由变量名组成的元组。

    class symtable.Class

    类的命名空间。继承自 SymbolTable

    • get_methods()

      返回类中声明的方法名组成的元组。

    class symtable.Symbol

    中的数据项,对应于源码中的某个标识符。构造函数不公开。

    • 如果符号在代码块中被引用了,则返回 True

    • is_imported()

      如果符号是由导入语句创建的,则返回 。

    • is_parameter()

      如果符号是参数,返回 True

    • is_global()

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

    • is_declared_global()

      如果符号用 global 声明为全局变量,则返回 True

    • is_local()

      如果符号在代码块内是局部变量,则返回 True

    • is_free()

      如果符号在代码块中被引用,但未赋值,则返回 True

    • is_assigned()

      如果符号在代码块中赋值,则返回 True

    • is_namespace()

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

      如果符号名用于 function 或 class 语句,则为 True。

      例如

      注意,一个符号名可以与多个对象绑定。如果结果为 True,则该符号名还可以绑定到其他对象上,比如 int 或 list ,且不会引入新的命名空间。

    • get_namespace()