symtable —コンパイラのシンボルテーブルへのアクセス—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/symtable
移動先:案内検索

symtable —コンパイラのシンボルテーブルへのアクセス

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



シンボルテーブルは、バイトコードが生成される直前にASTからコンパイラによって生成されます。 シンボルテーブルは、コード内のすべての識別子のスコープを計算する役割を果たします。 symtable は、これらのテーブルを調べるためのインターフェースを提供します。

シンボルテーブルの生成

symtable.symtable(code, filename, compile_type)
Pythonソースコードのトップレベル SymbolTable を返します。 filename は、コードを含むファイルの名前です。 compile_type は、 compile()mode 引数に似ています。


シンボルテーブルの調査

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)

テーブルで name を検索し、 Symbol インスタンスを返します。

get_symbols()

テーブル内の名前の Symbol インスタンスのリストを返します。

get_children()

ネストされたシンボルテーブルのリストを返します。

class symtable.Function

関数またはメソッドの名前空間。 このクラスは SymbolTable を継承します。

get_parameters()

パラメータの名前を含むタプルをこの関数に返します。

get_locals()

この関数でローカルの名前を含むタプルを返します。

get_globals()

この関数でグローバルの名前を含むタプルを返します。

get_nonlocals()

この関数で非ローカルの名前を含むタプルを返します。

get_frees()

この関数の自由変数の名前を含むタプルを返します。

class symtable.Class
クラスの名前空間。 このクラスは SymbolTable を継承します。
get_methods()
クラスで宣言されたメソッドの名前を含むタプルを返します。
class symtable.Symbol

ソースの識別子に対応する SymbolTable のエントリ。 コンストラクターは公開されていません。

get_name()

シンボルの名前を返します。

is_referenced()

シンボルがそのブロックで使用されている場合は、Trueを返します。

is_imported()

シンボルがインポートステートメントから作成された場合は、Trueを返します。

is_parameter()

シンボルがパラメータの場合は、Trueを返します。

is_global()

シンボルがグローバルの場合は、Trueを返します。

is_nonlocal()

シンボルが非ローカルの場合は、Trueを返します。

is_declared_global()

シンボルがグローバルステートメントでグローバルに宣言されている場合は、Trueを返します。

is_local()

シンボルがそのブロックに対してローカルである場合は、Trueを返します。

is_annotated()

シンボルに注釈が付けられている場合は、Trueを返します。

バージョン3.6の新機能。

is_free()

シンボルがそのブロックで参照されているが、割り当てられていない場合は、Trueを返します。

is_assigned()

シンボルがそのブロックで割り当てられている場合は、Trueを返します。

is_namespace()

名前バインディングによって新しい名前空間が導入された場合は、Trueを返します。

名前が関数またはクラスステートメントのターゲットとして使用されている場合、これは当てはまります。

例えば:

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

1つの名前を複数のオブジェクトにバインドできることに注意してください。 結果がTrueの場合、名前は、新しい名前空間を導入しないintやlistなどの他のオブジェクトにもバインドされる可能性があります。

get_namespaces()

この名前にバインドされている名前空間のリストを返します。

get_namespace()

この名前にバインドされた名前空間を返します。 複数の名前空間がバインドされている場合、 ValueError が発生します。