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

源代码: Lib/symtable.py


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

32.3.1. 生成符号表

  • symtable. symtable(* code filename compile_type *)
    • 返回顶层SymbolTable作为 Python 源* code *。 * filename *是包含代码的文件的名称。 * compile_type 类似于compile() mode *参数。

32.3.2. 检查符号表

  • 类别 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
  • has_import_star ( )

    • 如果该块使用已加星标的从导入,则返回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_frees ( )

    • 返回一个包含此函数中自由变量名称的 Tuples。
  • 类别 symtable. Class

  • get_methods ( )

    • 返回一个包含在类中语句的方法名称的 Tuples。
  • 类别 symtable. Symbol

    • SymbolTable中与源中的标识符相对应的条目。构造函数不是公共的。
  • get_name ( )

    • 返回符号的名称。
  • is_referenced ( )

    • 如果符号在其块中使用,则返回True
  • is_imported ( )

    • 如果符号是从导入语句创建的,则返回True
  • is_parameter ( )

    • 如果符号是参数,则返回True
  • is_global ( )

    • 如果符号是全局符号,则返回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