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
|
ノート:
バージョン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])
args と kwds を、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])
- 現在のフレームと、現在処理されている例外が発生したフレームとの間のスタックのフレームレコードのリストを返します。 リストの最初のエントリは発信者を表します。 最後のエントリは、例外が発生した場所を表します。