28.13. inspect —ライブオブジェクトを検査します—Pythonドキュメント

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

28.13。 検査する —ライブオブジェクトを検査します

バージョン2.1の新機能。


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



inspect モジュールは、モジュール、クラス、メソッド、関数、トレースバック、フレームオブジェクト、コードオブジェクトなどのライブオブジェクトに関する情報を取得するのに役立ついくつかの便利な関数を提供します。 たとえば、クラスの内容を調べたり、メソッドのソースコードを取得したり、関数の引数リストを抽出してフォーマットしたり、詳細なトレースバックを表示するために必要なすべての情報を取得したりするのに役立ちます。

このモジュールによって提供されるサービスには、主に4種類あります。型チェック、ソースコードの取得、クラスと関数の検査、およびインタープリタースタックの検査です。

28.13.1。 タイプとメンバー

getmembers()関数は、クラスやモジュールなどのオブジェクトのメンバーを取得します。 名前が「is」で始まる16個の関数は、主に getmembers()の2番目の引数の便利な選択肢として提供されています。 また、次の特別な属性をいつ見つけることができるかを判断するのにも役立ちます。

タイプ 属性 説明 ノート
モジュール __doc__ ドキュメント文字列
__ファイル__ ファイル名(組み込みモジュールにはありません)
クラス __doc__ ドキュメント文字列
__モジュール__ このクラスが定義されたモジュールの名前
方法 __doc__ ドキュメント文字列
__名前__ このメソッドが定義された名前
im_class このメソッドを要求したクラスオブジェクト (1)
im_funcまたは__func__ メソッドの実装を含む関数オブジェクト
im_selfまたは__self__ このメソッドがバインドされているインスタンス、またはNone
関数 __doc__ ドキュメント文字列
__名前__ この関数が定義された名前
func_code コンパイルされた関数を含むコードオブジェクト bytecode
func_defaults 引数のデフォルト値のタプル
func_doc (__doc__と同じ)
func_globals この関数が定義されたグローバル名前空間
func_name (__name__と同じ)
発生器 __iter__ コンテナでの反復をサポートするように定義されています
選ぶ ジェネレーター内で新しいGeneratorExit例外を発生させて、反復を終了します
gi_code コードオブジェクト
gi_frame フレームオブジェクト、またはジェネレーターが使い果たされたらNone
gi_running ジェネレーターの実行中は1に設定され、それ以外の場合は0に設定されます。
コンテナから次のアイテムを返す
送信 ジェネレーターを再開し、現在のyield式の結果となる値を「送信」します
投げる ジェネレーター内で例外を発生させるために使用されます
トレースバック tb_frame このレベルのフレームオブジェクト
tb_lasti 最後に試行された命令のインデックス(バイトコード)
tb_lineno Pythonソースコードの現在の行番号
tb_next 次の内部トレースバックオブジェクト(このレベルで呼び出されます)
フレーム f_back 次の外部フレームオブジェクト(このフレームの呼び出し元)
f_builtins このフレームで見られる組み込みの名前空間
f_code このフレームで実行されているコードオブジェクト
f_exc_traceback このフレームで発生した場合はトレースバック、またはNone
f_exc_type このフレームで発生した場合は例外タイプ、またはNone
f_exc_value このフレームで発生した場合は例外値、またはNone
f_globals このフレームで見られるグローバル名前空間
f_lasti 最後に試行された命令のインデックス(バイトコード)
f_lineno Pythonソースコードの現在の行番号
f_locals このフレームで見られるローカル名前空間
f_restricted フレームが制限付き実行モードの場合は0または1
f_trace このフレームのトレース機能、またはNone
コード co_argcount 引数の数(*または**引数を含まない)
co_code コンパイルされた生のバイトコードの文字列
co_consts バイトコードで使用される定数のタプル
co_filename このコードオブジェクトが作成されたファイルの名前
co_firstlineno Pythonソースコードの最初の行の数
co_flags 2 =ニューローカル| 4 = * arg | 8 = ** arg
co_lnotab 行番号のバイトコードインデックスへのエンコードされたマッピング
co_name このコードオブジェクトが定義された名前
co_names ローカル変数の名前のタプル
co_nlocals ローカル変数の数
co_stacksize 必要な仮想マシンのスタックスペース
co_varnames 引数とローカル変数の名前のタプル
ビルトイン __doc__ ドキュメント文字列
__名前__ この関数またはメソッドの元の名前
__自己__ メソッドがバインドされているインスタンス、またはNone

ノート:

  1. バージョン2.2で変更: im_classは、メソッドを定義したクラスを参照するために使用されていました。

inspect.getmembers(object[, predicate])

名前でソートされた(名前、値)ペアのリスト内のオブジェクトのすべてのメンバーを返します。 オプションの predicate 引数が指定されている場合、述部が真の値を返すメンバーのみが含まれます。

ノート

getmembers()は、引数がクラスの場合、メタクラス属性を返しません(この動作は dir()関数から継承されます)。

inspect.getmoduleinfo(path)

モジュールの場合は path で識別されるファイルを、モジュールとして識別されない場合はNoneで識別されるファイルをPythonがどのように解釈するかを説明する値のタプルを返します。 戻りタプルは(name, suffix, mode, module_type)です。ここで、 name は、囲んでいるパッケージの名前を含まないモジュールの名前です。サフィックスは、ファイル名の末尾部分です(ドット区切りの拡張子ではない場合があります)、モードは使用される open()モード('r'または'rb')であり、 module_type は、モジュールのタイプを示す整数です。 module_type には、 imp モジュールで定義されている定数と比較できる値があります。 モジュールタイプの詳細については、そのモジュールのドキュメントを参照してください。

バージョン2.6で変更: 名前付きタプル ModuleInfo(name, suffix, mode, module_type)を返します。

inspect.getmodulename(path)
ファイル path で指定されたモジュールの名前を、囲んでいるパッケージの名前を含めずに返します。 これは、インタプリタがモジュールを検索するときに使用するのと同じアルゴリズムを使用します。 インタプリタのルールに従って名前が一致しない場合は、Noneが返されます。
inspect.ismodule(object)
オブジェクトがモジュールの場合はtrueを返します。
inspect.isclass(object)
オブジェクトがクラスである場合、組み込みであるかPythonコードで作成されているかにかかわらず、trueを返します。
inspect.ismethod(object)
オブジェクトがPythonで記述されたバインドされたメソッドまたはバインドされていないメソッドの場合はtrueを返します。
inspect.isfunction(object)
オブジェクトがPython関数であり、 lambda 式によって作成された関数を含む場合はtrueを返します。
inspect.isgeneratorfunction(object)

オブジェクトがPythonジェネレーター関数の場合はtrueを返します。

バージョン2.6の新機能。

inspect.isgenerator(object)

オブジェクトがジェネレーターの場合はtrueを返します。

バージョン2.6の新機能。

inspect.istraceback(object)
オブジェクトがトレースバックの場合はtrueを返します。
inspect.isframe(object)
オブジェクトがフレームの場合はtrueを返します。
inspect.iscode(object)
オブジェクトがコードの場合はtrueを返します。
inspect.isbuiltin(object)
オブジェクトが組み込み関数またはバインドされた組み込みメソッドの場合はtrueを返します。
inspect.isroutine(object)
オブジェクトがユーザー定義または組み込みの関数またはメソッドである場合はtrueを返します。
inspect.isabstract(object)

オブジェクトが抽象基本クラスの場合はtrueを返します。

バージョン2.6の新機能。

inspect.ismethoddescriptor(object)

オブジェクトがメソッド記述子の場合はtrueを返しますが、 ismethod()isclass()isfunction()、または isbuiltin()[の場合はtrueを返しません。 X142X]は本当です。

これはPython2.2の時点で新しく、たとえばint.__add__にも当てはまります。 このテストに合格したオブジェクトには、 __ get __()メソッドがありますが、 __ set __()メソッドはありませんが、それを超えると、属性のセットが異なります。 __ name __ 属性は通常賢明であり、__doc__はしばしば賢明です。

他のテストの1つにも合格する記述子を介して実装されたメソッドは、 ismethoddescriptor()テストからfalseを返します。これは、他のテストがより多くのことを約束しているためです。たとえば、im_funcを使用することを期待できます。オブジェクトが ismethod()を通過したときの属性(など)。

inspect.isdatadescriptor(object)

オブジェクトがデータ記述子の場合はtrueを返します。

データ記述子には、 __ get __ メソッドと __ set __ メソッドの両方があります。 例としては、プロパティ(Pythonで定義)、getsets、およびメンバーがあります。 後者の2つはCで定義されており、これらのタイプで利用できるより具体的なテストがあり、Pythonの実装全体で堅牢です。 通常、データ記述子には __ name __ 属性と__doc__属性もあります(プロパティ、getset、およびメンバーにはこれらの属性の両方があります)が、これは保証されません。

バージョン2.3の新機能。

inspect.isgetsetdescriptor(object)

オブジェクトがgetset記述子の場合はtrueを返します。

バージョン2.5の新機能。

inspect.ismemberdescriptor(object)

オブジェクトがメンバー記述子の場合はtrueを返します。

バージョン2.5の新機能。


28.13.2。 ソースコードの取得

inspect.getdoc(object)
cleandoc()でクリーンアップされたオブジェクトのドキュメント文字列を取得します。
inspect.getcomments(object)
オブジェクトのソースコードの直前(クラス、関数、またはメソッドの場合)、またはPythonソースファイルの先頭(オブジェクトがモジュールの場合)のコメント行を1つの文字列で返します。
inspect.getfile(object)
オブジェクトが定義された(テキストまたはバイナリ)ファイルの名前を返します。 オブジェクトが組み込みのモジュール、クラス、または関数の場合、これはTypeErrorで失敗します。
inspect.getmodule(object)
オブジェクトがどのモジュールで定義されているかを推測してみてください。
inspect.getsourcefile(object)
オブジェクトが定義されたPythonソースファイルの名前を返します。 オブジェクトが組み込みのモジュール、クラス、または関数の場合、これはTypeErrorで失敗します。
inspect.getsourcelines(object)
オブジェクトのソース行と開始行番号のリストを返します。 引数は、モジュール、クラス、メソッド、関数、トレースバック、フレーム、またはコードオブジェクトです。 ソースコードは、オブジェクトに対応する行のリストとして返され、行番号は、元のソースファイルのどこでコードの最初の行が見つかったかを示します。 ソースコードを取得できない場合は、IOErrorが発生します。
inspect.getsource(object)
オブジェクトのソースコードのテキストを返します。 引数は、モジュール、クラス、メソッド、関数、トレースバック、フレーム、またはコードオブジェクトです。 ソースコードは単一の文字列として返されます。 ソースコードを取得できない場合は、IOErrorが発生します。
inspect.cleandoc(doc)

コードのブロックと整列するようにインデントされているdocstringからインデントをクリーンアップします。

先頭の空白はすべて最初の行から削除されます。 2行目以降で均一に削除できる先頭の空白はすべて削除されます。 その後、最初と最後の空の行が削除されます。 また、すべてのタブがスペースに展開されます。

バージョン2.6の新機能。


28.13.3。 クラスと関数

inspect.getclasstree(classes[, unique])
指定されたクラスのリストをネストされたリストの階層に配置します。 ネストされたリストが表示される場合、リストの直前にエントリがあるクラスから派生したクラスが含まれます。 各エントリは、クラスとその基本クラスのタプルを含む2タプルです。 unique 引数がtrueの場合、指定されたリストの各クラスに対して返される構造体に1つのエントリのみが表示されます。 そうしないと、多重継承を使用するクラスとその子孫が複数回表示されます。
inspect.getargspec(func)

Python関数の引数の名前とデフォルト値を取得します。 (args, varargs, keywords, defaults)の4つのタプルが返されます。 args は、引数名のリストです(ネストされたリストが含まれる場合があります)。 varargs および keywords は、*および**引数またはNoneの名前です。 defaults はデフォルトの引数値のタプルであり、デフォルトの引数がない場合はNoneです。 このタプルに n 要素がある場合、それらは args にリストされている最後の n 要素に対応します。

バージョン2.6で変更: 名前付きタプル ArgSpec(args, varargs, keywords, defaults)を返します。

inspect.getargvalues(frame)

特定のフレームに渡された引数に関する情報を取得します。 (args, varargs, keywords, locals)の4つのタプルが返されます。 args は、引数名のリストです(ネストされたリストが含まれる場合があります)。 varargs および keywords は、*および**引数またはNoneの名前です。 locals は、指定されたフレームのローカル辞書です。

バージョン2.6で変更: 名前付きタプル ArgInfo(args, varargs, keywords, locals)を返します。

inspect.formatargspec(args[, varargs, varkw, defaults, formatarg, formatvarargs, formatvarkw, formatvalue, join])
getargspec()によって返される4つの値からかなりの引数仕様をフォーマットします。 format *引数は、名前と値を文字列に変換するために呼び出される、対応するオプションのフォーマット関数です。
inspect.formatargvalues(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue, join])
getargvalues()によって返される4つの値からかなりの引数仕様をフォーマットします。 format *引数は、名前と値を文字列に変換するために呼び出される、対応するオプションのフォーマット関数です。
inspect.getmro(cls)
clsを含むクラスclsの基本クラスのタプルをメソッド解決順に返します。 このタプルにクラスが複数回表示されることはありません。 メソッドの解決順序はclsのタイプに依存することに注意してください。 非常に特殊なユーザー定義のメタタイプが使用されていない限り、clsがタプルの最初の要素になります。
inspect.getcallargs(func[, *args][, **kwds])

argskwds を、Python関数またはメソッド func の引数名に、それらで呼び出されたかのようにバインドします。 バインドされたメソッドの場合、最初の引数(通常はselfという名前)も関連付けられたインスタンスにバインドします。 引数名(*および**引数の名前を含む)を args および kwds [からの値にマッピングして、dictが返されます。 X165X]。 func を誤って呼び出した場合、つまり func(*args, **kwds)が互換性のない署名のために例外を発生させる場合は常に、同じタイプおよび同じまたは類似のメッセージの例外が発生します。 例えば:

>>> from inspect import getcallargs
>>> def f(a, b=1, *pos, **named):
...     pass
>>> getcallargs(f, 1, 2, 3)
{'a': 1, 'named': {}, 'b': 2, 'pos': (3,)}
>>> getcallargs(f, a=2, x=4)
{'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()}
>>> getcallargs(f)
Traceback (most recent call last):
...
TypeError: f() takes at least 1 argument (0 given)

バージョン2.7の新機能。


28.13.4。 インタプリタスタック

次の関数が「フレームレコード」を返す場合、各レコードは6つの項目のタプルです。フレームオブジェクト、ファイル名、現在の行の行番号、関数名、ソースコードからのコンテキスト行のリスト、およびそのリスト内の現在の行のインデックス。

ノート

これらの関数が返すフレームレコードの最初の要素にあるように、フレームオブジェクトへの参照を保持すると、プログラムで参照サイクルが作成される可能性があります。 参照サイクルが作成されると、Pythonのオプションのサイクル検出器が有効になっている場合でも、サイクルを形成するオブジェクトからアクセスできるすべてのオブジェクトの寿命がはるかに長くなる可能性があります。 このようなサイクルを作成する必要がある場合は、オブジェクトの破棄の遅延や発生するメモリ消費の増加を回避するために、それらが明示的に中断されていることを確認することが重要です。

サイクル検出器はこれらをキャッチしますが、 finally 句でサイクルを削除することにより、フレーム(およびローカル変数)の破棄を決定論的にすることができます。 これは、Pythonのコンパイル時にサイクル検出器が無効になっている場合、または gc.disable()を使用している場合にも重要です。 例えば:

def handle_stackframe_without_leak():
    frame = inspect.currentframe()
    try:
        # do something with the frame
    finally:
        del frame

これらの関数のほとんどでサポートされているオプションの context 引数は、現在の行を中心として返されるコンテキストの行数を指定します。

inspect.getframeinfo(frame[, context])

フレームまたはトレースバックオブジェクトに関する情報を取得します。 フレームのフレームレコードの最後の5つの要素である5タプルが返されます。

バージョン2.6で変更: 名前付きタプル Traceback(filename, lineno, function, code_context, index)を返します。

inspect.getouterframes(frame[, context])
フレームとすべての外部フレームのフレームレコードのリストを取得します。 これらのフレームは、フレームの作成につながる呼び出しを表します。 返されるリストの最初のエントリはフレームを表します。 最後のエントリは、フレームのスタックの最も外側の呼び出しを表します。
inspect.getinnerframes(traceback[, context])
トレースバックのフレームとすべての内部フレームのフレームレコードのリストを取得します。 これらのフレームは、フレームの結果として行われた呼び出しを表します。 リストの最初のエントリは traceback を表します。 最後のエントリは、例外が発生した場所を表します。
inspect.currentframe()
呼び出し元のスタックフレームのフレームオブジェクトを返します。
inspect.stack([context])
呼び出し元のスタックのフレームレコードのリストを返します。 返されたリストの最初のエントリは、呼び出し元を表します。 最後のエントリは、スタックの最も外側の呼び出しを表します。
inspect.trace([context])
現在のフレームと、現在処理されている例外が発生したフレームとの間のスタックのフレームレコードのリストを返します。 リストの最初のエントリは発信者を表します。 最後のエントリは、例外が発生した場所を表します。