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" が送出されます。
