# 32.3. `symtable` - 访问编译器的符号表

源代码： Lib / symtable.py

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

## 32.3.1. Generating Symbol Tables

`symtable.``symtable`(code, filename, compile_type)

  返回对于Python源代码代码的toplevel `SymbolTable`。filename是包含代码的文件的名称。compile_type类似于`compile()`的模式参数。

## 32.3.2. Examining Symbol Tables

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`。

  `get_identifiers`()

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

  `lookup`(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`()

    如果符号是从import语句创建的，则返回`True`。

  `is_parameter`()

    如果符号是参数，则返回`True`。

  `is_global`()

    如果符号是全局的，则返回`True`。

  `is_declared_global`()

    如果符号已使用全局语句声明为全局，则返回`True`。

  `is_local`()

    如果符号位于其块的本地，则返回`True`。

  `is_free`()

    如果符号在其块中引用，但未分配给，则返回`True`。

  `is_assigned`()

    如果在其块中分配了符号，则返回`True`。

  `is_namespace`()

    如果名称绑定引入新的命名空间，则返回`True`。

    如果将该名称用作函数或类语句的目标，则为true。

    例如：

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

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

  `get_namespaces`()

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

  `get_namespace`()

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