# 32.3. `symtable` --- コンパイラの記号表へのアクセス

ソースコード: Lib/symtable.py

記号表(symbol table)は、コンパイラが AST からバイトコードを生成する直前に作られます。記号表はコード中の全ての識別子のスコープの算出に責任を持ちます。 `symtable` はこうした記号表を調べるインターフェイスを提供します。

## 32.3.1. 記号表の生成

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

  Python ソース code に対するトップレベルの `SymbolTable` を返します。 filename はコードを収めてあるファイルの名前です。 compile_type は `compile()` の mode 引数のようなものです。

## 32.3.2. 記号表の検査

class `symtable.``SymbolTable`

  ブロックに対する名前空間の記号表。コンストラクタはパブリックではありません。

  `get_type`()

    記号表の型を返します。有り得る値は `'class'`, `'module'`, `'function'` です。

  `get_id`()

    記号表の識別子を返します。

  `get_name`()

    記号表の名前を返します。この名前は記号表がクラスに対するものであればクラス名であり、関数に対するものであれば関数名であり、グローバルな (`get_type()` が `'module'` を返す) 記号表であれば `'top'` です。

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

    記号が import 文で作られたものならば `True` を返します。

  `is_parameter`()

    記号がパラメータならば `True` を返します。

  `is_global`()

    記号がグローバルならば `True` を返します。

  `is_declared_global`()

    記号が global 文によってグローバルであると宣言されているなら `True` を返します。

  `is_local`()

    記号がそのブロックに対してローカルならば `True` を返します。

  `is_free`()

    記号がそのブロックの中で参照されていて、しかし代入は行われないならば `True` を返します。

  `is_assigned`()

    記号がそのブロックの中で代入されているならば `True` を返します。

  `is_namespace`()

    名前の束縛が新たな名前空間を導入するならば `True` を返します。

    名前が関数または class 文のターゲットとして使われるならば、真です。

    例えば:

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

    一つの名前が複数のオブジェクトに束縛されうることに注意しましょう。結果が `True` であったとしても、その名前は他のオブジェクトにも束縛されるかもしれず、それがたとえば整数やリストであれば、そこでは新たな名前空間は導入されません。

  `get_namespaces`()

    この名前に束縛された名前空間のリストを返します。

  `get_namespace`()

    この名前に束縛されたただ一つの名前空間を返します。束縛された名前空間が一つより多くあれば `ValueError` が送出されます。