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

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

inspect —ライブオブジェクトを検査します

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



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

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

タイプとメンバー

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

タイプ 属性 説明
モジュール __doc__ ドキュメント文字列
__ファイル__ ファイル名(組み込みモジュールにはありません)
クラス __doc__ ドキュメント文字列
__名前__ このクラスが定義された名前
__qualname__ 修飾名
__モジュール__ このクラスが定義されたモジュールの名前
方法 __doc__ ドキュメント文字列
__名前__ このメソッドが定義された名前
__qualname__ 修飾名
__func__ メソッドの実装を含む関数オブジェクト
__自己__ このメソッドがバインドされているインスタンス、またはNone
__モジュール__ このメソッドが定義されたモジュールの名前
関数 __doc__ ドキュメント文字列
__名前__ この関数が定義された名前
__qualname__ 修飾名
__コード__ コンパイルされた関数を含むコードオブジェクト bytecode
__defaults__ 位置パラメータまたはキーワードパラメータのデフォルト値のタプル
__kwdefaults__ キーワードのみのパラメータのデフォルト値のマッピング
__globals__ この関数が定義されたグローバル名前空間
__注釈__ パラメータ名の注釈へのマッピング。 "return"キーは、リターン注釈用に予約されています。
__モジュール__ この関数が定義されたモジュールの名前
トレースバック tb_frame このレベルのフレームオブジェクト
tb_lasti 最後に試行された命令のインデックス(バイトコード)
tb_lineno Pythonソースコードの現在の行番号
tb_next 次の内部トレースバックオブジェクト(このレベルで呼び出されます)
フレーム f_back 次の外部フレームオブジェクト(このフレームの呼び出し元)
f_builtins このフレームで見られる組み込みの名前空間
f_code このフレームで実行されているコードオブジェクト
f_globals このフレームで見られるグローバル名前空間
f_lasti 最後に試行された命令のインデックス(バイトコード)
f_lineno Pythonソースコードの現在の行番号
f_locals このフレームで見られるローカル名前空間
f_trace このフレームのトレース機能、またはNone
コード co_argcount 引数の数(キーワードのみの引数、*または**引数は含まれません)
co_code コンパイルされた生のバイトコードの文字列
co_cellvars セル変数の名前のタプル(スコープを含むことによって参照されます)
co_consts バイトコードで使用される定数のタプル
co_filename このコードオブジェクトが作成されたファイルの名前
co_firstlineno Pythonソースコードの最初の行の数
co_flags CO_*フラグのビットマップ、続きを読むここ
co_lnotab 行番号のバイトコードインデックスへのエンコードされたマッピング
co_freevars 自由変数の名前のタプル(関数のクロージャーを介して参照)
co_posonlyargcount 位置のみの引数の数
co_kwonlyargcount キーワードのみの引数の数(**引数を含まない)
co_name このコードオブジェクトが定義された名前
co_names ローカル変数の名前のタプル
co_nlocals ローカル変数の数
co_stacksize 必要な仮想マシンのスタックスペース
co_varnames 引数とローカル変数の名前のタプル
発生器 __名前__ 名前
__qualname__ 修飾名
gi_frame フレーム
gi_running 発電機は動いていますか?
gi_code コード
gi_yieldfrom yield fromまたはNoneによって繰り返されるオブジェクト
コルーチン __名前__ 名前
__qualname__ 修飾名
cr_await 待機中のオブジェクト、またはNone
cr_frame フレーム
cr_running コルーチンは実行されていますか?
cr_code コード
cr_origin コルーチンが作成された場所、またはNonesys.set_coroutine_origin_tracking_depth()を参照してください
ビルトイン __doc__ ドキュメント文字列
__名前__ この関数またはメソッドの元の名前
__qualname__ 修飾名
__自己__ メソッドがバインドされているインスタンス、またはNone

バージョン3.5で変更:ジェネレーターに__qualname__およびgi_yieldfrom属性を追加します。

ジェネレーターの__name__属性は、コード名ではなく関数名から設定されるようになり、変更できるようになりました。


バージョン3.7で変更:コルーチンにcr_origin属性を追加。


inspect.getmembers(object[, predicate])

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

ノート

getmembers()は、引数がクラスであり、それらの属性がメタクラスのカスタム__dir__()にリストされている場合にのみ、メタクラスで定義されたクラス属性を返します。

inspect.getmodulename(path)

ファイル path で指定されたモジュールの名前を、囲んでいるパッケージの名前を含めずに返します。 ファイル拡張子は、 importlib.machinery.all_suffixes()のすべてのエントリに対してチェックされます。 一致する場合、拡張子が削除された最終パスコンポーネントが返されます。 それ以外の場合は、Noneが返されます。

この関数 only は、実際のPythonモジュールに意味のある名前を返すことに注意してください。Pythonパッケージを参照する可能性のあるパスは、引き続きNoneを返します。

バージョン3.3で変更:この関数は importlib に直接基づいています。

inspect.ismodule(object)
オブジェクトがモジュールの場合は、Trueを返します。
inspect.isclass(object)
オブジェクトがクラスである場合、組み込みであるかPythonコードで作成されているかにかかわらず、Trueを返します。
inspect.ismethod(object)
オブジェクトがPythonで記述されたバインドされたメソッドである場合は、Trueを返します。
inspect.isfunction(object)
オブジェクトがPython関数の場合、Trueを返します。これには、 lambda 式によって作成された関数が含まれます。
inspect.isgeneratorfunction(object)

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

バージョン3.8で変更: functools.partial()でラップされた関数は、ラップされた関数がPythonジェネレーター関数の場合、Trueを返すようになりました。

inspect.isgenerator(object)
オブジェクトがジェネレーターの場合は、Trueを返します。
inspect.iscoroutinefunction(object)

オブジェクトがコルーチン関数async def 構文で定義された関数)の場合は、Trueを返します。

バージョン3.5の新機能。

バージョン3.8で変更: functools.partial()でラップされた関数は、ラップされた関数がコルーチン関数の場合、Trueを返すようになりました。

inspect.iscoroutine(object)

オブジェクトが async def 関数によって作成されたコルーチンの場合、Trueを返します。

バージョン3.5の新機能。

inspect.isawaitable(object)

オブジェクトが await 式で使用できる場合は、Trueを返します。

ジェネレーターベースのコルーチンを通常のジェネレーターと区別するためにも使用できます。

def gen():
    yield
@types.coroutine
def gen_coro():
    yield

assert not isawaitable(gen())
assert isawaitable(gen_coro())

バージョン3.5の新機能。

inspect.isasyncgenfunction(object)

オブジェクトが非同期ジェネレーター関数の場合、Trueを返します。次に例を示します。

>>> async def agen():
...     yield 1
...
>>> inspect.isasyncgenfunction(agen)
True

バージョン3.6の新機能。

バージョン3.8で変更: functools.partial()でラップされた関数は、ラップされた関数が非同期ジェネレーター関数である場合、Trueを返すようになりました。

inspect.isasyncgen(object)

オブジェクトが非同期ジェネレーター関数によって作成された非同期ジェネレーターイテレーターの場合、Trueを返します。

バージョン3.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を返します。
inspect.ismethoddescriptor(object)

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

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

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

inspect.isdatadescriptor(object)

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

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

inspect.isgetsetdescriptor(object)
オブジェクトがgetset記述子の場合は、Trueを返します。
inspect.ismemberdescriptor(object)
オブジェクトがメンバー記述子の場合は、Trueを返します。


ソースコードの取得

inspect.getdoc(object)

cleandoc()でクリーンアップされたオブジェクトのドキュメント文字列を取得します。 オブジェクトのドキュメント文字列が指定されておらず、オブジェクトがクラス、メソッド、プロパティ、または記述子である場合は、継承階層からドキュメント文字列を取得します。

バージョン3.5で変更:ドキュメント文字列は、オーバーライドされない場合でも継承されるようになりました。

inspect.getcomments(object)
オブジェクトのソースコードの直前(クラス、関数、またはメソッドの場合)、またはPythonソースファイルの先頭(オブジェクトがモジュールの場合)のコメント行を1つの文字列で返します。 オブジェクトのソースコードが利用できない場合は、Noneを返します。 これは、オブジェクトがCまたはインタラクティブシェルで定義されている場合に発生する可能性があります。
inspect.getfile(object)
オブジェクトが定義された(テキストまたはバイナリ)ファイルの名前を返します。 オブジェクトが組み込みのモジュール、クラス、または関数の場合、これは TypeError で失敗します。
inspect.getmodule(object)
オブジェクトがどのモジュールで定義されているかを推測してみてください。
inspect.getsourcefile(object)
オブジェクトが定義されたPythonソースファイルの名前を返します。 オブジェクトが組み込みのモジュール、クラス、または関数の場合、これは TypeError で失敗します。
inspect.getsourcelines(object)

オブジェクトのソース行と開始行番号のリストを返します。 引数は、モジュール、クラス、メソッド、関数、トレースバック、フレーム、またはコードオブジェクトです。 ソースコードは、オブジェクトに対応する行のリストとして返され、行番号は、元のソースファイルのどこでコードの最初の行が見つかったかを示します。 ソースコードを取得できない場合、 OSError が発生します。

バージョン3.3で変更: IOError の代わりに OSError が発生し、以前のエイリアスになりました。

inspect.getsource(object)

オブジェクトのソースコードのテキストを返します。 引数は、モジュール、クラス、メソッド、関数、トレースバック、フレーム、またはコードオブジェクトです。 ソースコードは単一の文字列として返されます。 ソースコードを取得できない場合、 OSError が発生します。

バージョン3.3で変更: IOError の代わりに OSError が発生し、以前のエイリアスになりました。

inspect.cleandoc(doc)

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

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


Signatureオブジェクトを使用した呼び出し可能オブジェクトのイントロスペクション

バージョン3.3の新機能。


Signatureオブジェクトは、呼び出し可能オブジェクトの呼び出し署名とその戻り注釈を表します。 Signatureオブジェクトを取得するには、 signature()関数を使用します。

inspect.signature(callable, *, follow_wrapped=True)

指定されたcallableSignature オブジェクトを返します。

>>> from inspect import signature
>>> def foo(a, *, b:int, **kwargs):
...     pass

>>> sig = signature(foo)

>>> str(sig)
'(a, *, b:int, **kwargs)'

>>> str(sig.parameters['b'])
'b:int'

>>> sig.parameters['b'].annotation
<class 'int'>

プレーンな関数やクラスから functools.partial()オブジェクトまで、幅広いPython呼び出し可能オブジェクトを受け入れます。

署名を提供できない場合は ValueError を発生させ、そのタイプのオブジェクトがサポートされていない場合は TypeError を発生させます。

関数のシグニチャーのスラッシュ(/)は、その前のパラメーターが位置のみであることを示します。 詳細については、位置のみのパラメータに関するFAQエントリを参照してください。

バージョン3.5の新機能: follow_wrappedパラメーター。 Falseを渡して、callableの署名を具体的に取得します(callable.__wrapped__は、装飾された呼び出し可能オブジェクトのラップを解除するために使用されません)。

ノート

一部の呼び出し可能オブジェクトは、Pythonの特定の実装ではイントロスペクトできない場合があります。 たとえば、CPythonでは、Cで定義された一部の組み込み関数は、引数に関するメタデータを提供しません。

class inspect.Signature(parameters=None, *, return_annotation=Signature.empty)

Signatureオブジェクトは、関数の呼び出しシグネチャとその戻りアノテーションを表します。 関数によって受け入れられたパラメーターごとに、パラメーターオブジェクトをパラメーターコレクションに格納します。

オプションの parameters 引数は、 Parameter オブジェクトのシーケンスであり、重複する名前のパラメーターがないこと、およびパラメーターが正しい順序になっていることを確認するために検証されます。 最初に定位置のみ、次に定位置またはキーワード、およびデフォルトのあるパラメーターはデフォルトのないパラメーターの後に続きます。

オプションの return_annotation 引数は、任意のPythonオブジェクトにすることができ、呼び出し可能オブジェクトの「return」アノテーションです。

署名オブジェクトは不変です。 Signature.replace()を使用して、変更されたコピーを作成します。

バージョン3.5で変更:署名オブジェクトは選択可能でハッシュ可能です。

empty

リターンアノテーションがないことを指定するための特別なクラスレベルのマーカー。

parameters

対応する Parameter オブジェクトへのパラメーター名の順序付けられたマッピング。 パラメータは、キーワードのみのパラメータを含め、厳密な定義順に表示されます。

バージョン3.7での変更: Pythonは、バージョン3.7の時点で、キーワードのみのパラメーターの宣言順序が保持されることを明示的に保証するだけでしたが、実際には、この順序は常にPython3で保持されていました。

return_annotation

呼び出し可能オブジェクトの「return」アノテーション。 呼び出し可能オブジェクトに「return」アノテーションがない場合、この属性は Signature.empty に設定されます。

bind(*args, **kwargs)

位置引数とキーワード引数からパラメーターへのマッピングを作成します。 *args**kwargsが署名に一致する場合、 BoundArguments を返すか、 TypeError を発生させます。

bind_partial(*args, **kwargs)

Signature.bind()と同じように機能しますが、一部の必須引数を省略できます( functools.partial()の動作を模倣します)。 BoundArguments を返し、または、渡された引数が署名と一致しない場合は、 TypeError を発生させます。

replace(*[, parameters][, return_annotation])

replaceが呼び出されたインスタンスに基づいて新しいSignatureインスタンスを作成します。 異なるparametersおよび/またはreturn_annotationを渡して、基本署名の対応するプロパティをオーバーライドすることができます。 コピーした署名からreturn_annotationを削除するには、 Signature.empty を渡します。

>>> def test(a, b):
...     pass
>>> sig = signature(test)
>>> new_sig = sig.replace(return_annotation="new return anno")
>>> str(new_sig)
"(a, b) -> 'new return anno'"
classmethod from_callable(obj, *, follow_wrapped=True)

指定された呼び出し可能objSignature (またはそのサブクラス)オブジェクトを返します。 follow_wrapped=Falseを渡すと、__wrapped__チェーンをアンラップせずに、objの署名を取得できます。

このメソッドは、 Signature のサブクラス化を簡素化します。

class MySignature(Signature):
    pass
sig = MySignature.from_callable(min)
assert isinstance(sig, MySignature)

バージョン3.5の新機能。

class inspect.Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty)

パラメータオブジェクトは不変です。 Parameterオブジェクトを変更する代わりに、 Parameter.replace()を使用して変更されたコピーを作成できます。

バージョン3.5で変更:パラメータオブジェクトは選択可能でハッシュ可能です。

empty

デフォルト値と注釈がないことを指定するための特別なクラスレベルのマーカー。

name

文字列としてのパラメータの名前。 名前は有効なPython識別子である必要があります。

default

パラメータのデフォルト値。 パラメータにデフォルト値がない場合、この属性は Parameter.empty に設定されます。

annotation

パラメータの注釈。 パラメータに注釈がない場合、この属性は Parameter.empty に設定されます。

kind

引数値がパラメーターにバインドされる方法について説明します。 可能な値(Parameter.KEYWORD_ONLYなどのパラメーターからアクセス可能):

名前

意味

POSITIONAL_ONLY

値は位置引数として指定する必要があります。 位置のみのパラメーターは、Python関数定義の/エントリ(存在する場合)の前に表示されるパラメーターです。

POSITIONAL_OR_KEYWORD

値は、キーワードまたは位置引数として指定できます(これは、Pythonで実装された関数の標準のバインディング動作です)。

VAR_POSITIONAL

他のパラメーターにバインドされていない位置引数のタプル。 これは、Python関数定義の*argsパラメーターに対応します。

KEYWORD_ONLY

値はキーワード引数として指定する必要があります。 キーワードのみのパラメーターは、Python関数定義の*または*argsエントリの後に表示されるパラメーターです。

VAR_KEYWORD

他のパラメータにバインドされていないキーワード引数の辞書。 これは、Python関数定義の**kwargsパラメーターに対応します。

例:デフォルト値なしですべてのキーワードのみの引数を出力します。

>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     if (param.kind == param.KEYWORD_ONLY and
...                        param.default is param.empty):
...         print('Parameter:', param)
Parameter: c
kind.description

Parameter.kindの列挙値を記述します。

バージョン3.8の新機能。

例:引数のすべての説明を出力します。

>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     print(param.kind.description)
positional or keyword
positional or keyword
keyword-only
keyword-only
replace(*[, name][, kind][, default][, annotation])

置き換えられたインスタンスが呼び出されたことに基づいて、新しいパラメータインスタンスを作成します。 Parameter 属性をオーバーライドするには、対応する引数を渡します。 パラメータからデフォルト値または/および注釈を削除するには、 Parameter.empty を渡します。

>>> from inspect import Parameter
>>> param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42)
>>> str(param)
'foo=42'

>>> str(param.replace()) # Will create a shallow copy of 'param'
'foo=42'

>>> str(param.replace(default=Parameter.empty, annotation='spam'))
"foo:'spam'"

バージョン3.4で変更: Python 3.3では、kindPOSITIONAL_ONLYに設定されている場合、パラメーターオブジェクトでnameNoneに設定できました。 ]。 これは許可されなくなりました。

class inspect.BoundArguments

Signature.bind()または Signature.bind_partial()呼び出しの結果。 関数のパラメーターへの引数のマッピングを保持します。

arguments

パラメータの名前から引数の値への順序付けられた可変マッピング( collections.OrderedDict )。 明示的にバインドされた引数のみが含まれます。 引数の変更は、引数および kwargs に反映されます。

引数処理の目的で、 Signature.parameters と組み合わせて使用する必要があります。

ノート

Signature.bind()または Signature.bind_partial()がデフォルト値に依存している引数はスキップされます。 ただし、必要に応じて、 BoundArguments.apply_defaults()を使用して追加してください。

args

位置引数値のタプル。 引数属性から動的に計算されます。

kwargs

キーワード引数値の辞書。 引数属性から動的に計算されます。

signature

Signature オブジェクトへの参照。

apply_defaults()

欠落している引数のデフォルト値を設定します。

可変位置引数(*args)の場合、デフォルトは空のタプルです。

可変キーワード引数(**kwargs)の場合、デフォルトは空のdictです。

>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])

バージョン3.5の新機能。

args および kwargs プロパティを使用して、関数を呼び出すことができます。

def test(a, *, b):
    ...

sig = signature(test)
ba = sig.bind(10, b=20)
test(*ba.args, **ba.kwargs)

も参照してください

PEP 362 -関数シグネチャオブジェクト。
詳細な仕様、実装の詳細、および例。


クラスと関数

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

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

バージョン3.0以降非推奨:通常はドロップイン置換であるが、関数アノテーションとキーワードのみのパラメーターも正しく処理する更新されたAPIに getfullargspec()を使用します。

または、 signature()および Signature Object を使用します。これらは、呼び出し可能オブジェクトに対してより構造化されたイントロスペクションAPIを提供します。

inspect.getfullargspec(func)

Python関数のパラメーターの名前とデフォルト値を取得します。 名前付きタプルが返されます。

FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)

args は、定位置パラメーター名のリストです。 varargs は、*パラメーターの名前、または任意の位置引数が受け入れられない場合はNoneの名前です。 varkw は、**パラメーターの名前、または任意のキーワード引数が受け入れられない場合はNoneの名前です。 defaultsn -最後の n 位置パラメーターに対応するデフォルト引数値のタプル、またはそのようなデフォルトが定義されていない場合はNoneです。 。 kwonlyargs は、宣言順のキーワードのみのパラメーター名のリストです。 kwonlydefaults は、 kwonlyargs から引数が指定されていない場合に使用されるデフォルト値にパラメーター名をマッピングする辞書です。 annotations は、パラメーター名を注釈にマッピングする辞書です。 特別なキー"return"は、関数の戻り値の注釈(存在する場合)を報告するために使用されます。

signature()および Signature Object は、呼び出し可能なイントロスペクションに推奨されるAPIを提供し、拡張モジュールAPIで時々発生する追加の動作(位置のみの引数など)をサポートすることに注意してください。 この関数は、主にPython 2 inspectモジュールAPIとの互換性を維持する必要があるコードで使用するために保持されます。

バージョン3.4で変更:この関数は signalture()に基づいていますが、__wrapped__属性を無視し、バインドされた署名出力にすでにバインドされている最初のパラメーターを含めますメソッド。

バージョン3.6での変更:このメソッドは、Python3.5で signature()を優先して非推奨として以前に文書化されていましたが、明確にサポートされている標準インターフェースを復元するために、この決定が取り消されました。従来の getargspec() APIから移行する単一ソースのPython2 / 3コード。

バージョン3.7での変更: Pythonは、バージョン3.7の時点で、キーワードのみのパラメーターの宣言順序が保持されることを明示的に保証するだけでしたが、実際には、この順序は常にPython3で保持されていました。

inspect.getargvalues(frame)

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

ノート

この関数は、Python3.5で非推奨として誤ってマークされていました。

inspect.formatargspec(args[, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations[, formatarg, formatvarargs, formatvarkw, formatvalue, formatreturns, formatannotations]])

getfullargspec()によって返された値からかなりの引数仕様をフォーマットします。

最初の7つの引数は、(argsvarargsvarkwdefaultskwonlyargskwonlydefaults、[X97X ] )。

他の6つの引数は、引数名、*引数名、**引数名、デフォルト値、戻り注釈、および個々の注釈をそれぞれ文字列に変換するために呼び出される関数です。

例えば:

>>> from inspect import formatargspec, getfullargspec
>>> def f(a: int, b: float):
...     pass
...
>>> formatargspec(*getfullargspec(f))
'(a: int, b: float)'

バージョン3.5以降非推奨: signature()および Signature Object を使用します。これらは、呼び出し可能オブジェクトのより優れたイントロスペクトAPIを提供します。

inspect.formatargvalues(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])

getargvalues()によって返される4つの値からかなりの引数仕様をフォーマットします。 format *引数は、名前と値を文字列に変換するために呼び出される、対応するオプションのフォーマット関数です。

ノート

この関数は、Python3.5で非推奨として誤ってマークされていました。

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,)}
True
>>> getcallargs(f, a=2, x=4) == {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()}
True
>>> getcallargs(f)
Traceback (most recent call last):
...
TypeError: f() missing 1 required positional argument: 'a'

バージョン3.2の新機能。

バージョン3.5以降非推奨:代わりに Signature.bind()および Signature.bind_partial()を使用してください。

inspect.getclosurevars(func)

Python関数またはメソッド func の外部名参照の現在の値へのマッピングを取得します。 名前付きタプル ClosureVars(nonlocals, globals, builtins, unbound)が返されます。 nonlocals は参照名を字句クロージャ変数にマップし、 globals は関数のモジュールグローバルにマップし、 builtins は関数本体から見えるビルトインにマップします。 unbound は、関数で参照されている名前のセットであり、現在のモジュールのグローバルおよび組み込みを指定すると、まったく解決できませんでした。

TypeError は、 func がPythonの関数またはメソッドでない場合に発生します。

バージョン3.3の新機能。

inspect.unwrap(func, *, stop=None)

func でラップされたオブジェクトを取得します。 __wrapped__属性のチェーンに従い、チェーンの最後のオブジェクトを返します。

stop は、ラッパーチェーン内のオブジェクトを唯一の引数として受け入れるオプションのコールバックであり、コールバックが真の値を返した場合にアンラップを早期に終了できるようにします。 コールバックが真の値を返さない場合、チェーンの最後のオブジェクトが通常どおり返されます。 たとえば、 signature()はこれを使用して、チェーン内のいずれかのオブジェクトに__signature__属性が定義されている場合にアンラップを停止します。

ValueError は、サイクルが発生した場合に発生します。

バージョン3.4の新機能。


インタプリタスタック

次の関数が「フレームレコード」を返す場合、各レコードは名前付きタプル FrameInfo(frame, filename, lineno, function, code_context, index)です。 タプルには、フレームオブジェクト、ファイル名、現在の行の行番号、関数名、ソースコードからのコンテキスト行のリスト、およびそのリスト内の現在の行のインデックスが含まれています。

バージョン3.5で変更:タプルの代わりに名前付きタプルを返します。


ノート

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

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

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

フレームを維持したい場合(たとえば、後でトレースバックを印刷するため)、 frame.clear()メソッドを使用して参照サイクルを中断することもできます。


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

inspect.getframeinfo(frame, context=1)
フレームまたはトレースバックオブジェクトに関する情報を取得します。 名前付きタプル Traceback(filename, lineno, function, code_context, index)が返されます。
inspect.getouterframes(frame, context=1)

フレームとすべての外部フレームのフレームレコードのリストを取得します。 これらのフレームは、フレームの作成につながる呼び出しを表します。 返されるリストの最初のエントリはフレームを表します。 最後のエントリは、フレームのスタックの最も外側の呼び出しを表します。

バージョン3.5で変更: 名前付きタプル FrameInfo(frame, filename, lineno, function, code_context, index)のリストが返されます。

inspect.getinnerframes(traceback, context=1)

トレースバックのフレームとすべての内部フレームのフレームレコードのリストを取得します。 これらのフレームは、フレームの結果として行われた呼び出しを表します。 リストの最初のエントリは traceback を表します。 最後のエントリは、例外が発生した場所を表します。

バージョン3.5で変更: 名前付きタプル FrameInfo(frame, filename, lineno, function, code_context, index)のリストが返されます。

inspect.currentframe()
呼び出し元のスタックフレームのフレームオブジェクトを返します。
inspect.stack(context=1)

呼び出し元のスタックのフレームレコードのリストを返します。 返されたリストの最初のエントリは、呼び出し元を表します。 最後のエントリは、スタックの最も外側の呼び出しを表します。

バージョン3.5で変更: 名前付きタプル FrameInfo(frame, filename, lineno, function, code_context, index)のリストが返されます。

inspect.trace(context=1)

現在のフレームと、現在処理されている例外が発生したフレームとの間のスタックのフレームレコードのリストを返します。 リストの最初のエントリは発信者を表します。 最後のエントリは、例外が発生した場所を表します。

バージョン3.5で変更: 名前付きタプル FrameInfo(frame, filename, lineno, function, code_context, index)のリストが返されます。


属性を静的に取得する

getattr()hasattr()はどちらも、属性の存在をフェッチまたはチェックするときにコードの実行をトリガーできます。 プロパティと同様に記述子が呼び出され、__getattr__()および__getattribute__()が呼び出される場合があります。

ドキュメントツールのように受動的なイントロスペクションが必要な場合、これは不便な場合があります。 getattr_static()getattr()と同じ署名を持っていますが、属性をフェッチするときにコードの実行を回避します。

inspect.getattr_static(obj, attr, default=None)

記述子プロトコル__getattr__()または__getattribute__()を介して動的ルックアップをトリガーせずに属性を取得します。

注:この関数は、getattrがフェッチできるすべての属性(動的に作成された属性など)を取得できない場合があり、getattrが取得できない属性(AttributeErrorを発生させる記述子など)を検出する場合があります。 また、インスタンスメンバーの代わりに記述子オブジェクトを返すこともできます。

インスタンス __ dict __ が別のメンバー(プロパティなど)によってシャドウされている場合、この関数はインスタンスメンバーを見つけることができません。

バージョン3.2の新機能。

getattr_static()は、Cで実装されたオブジェクトのスロット記述子やgetset記述子などの記述子を解決しません。 基になる属性の代わりに記述子オブジェクトが返されます。

次のようなコードでこれらを処理できます。 これらを呼び出す任意のgetset記述子の場合、コードの実行がトリガーされる可能性があることに注意してください。

# example code for resolving the builtin descriptor types
class _foo:
    __slots__ = ['foo']

slot_descriptor = type(_foo.foo)
getset_descriptor = type(type(open(__file__)).name)
wrapper_descriptor = type(str.__dict__['__add__'])
descriptor_types = (slot_descriptor, getset_descriptor, wrapper_descriptor)

result = getattr_static(some_object, 'foo')
if type(result) in descriptor_types:
    try:
        result = result.__get__()
    except AttributeError:
        # descriptors can raise AttributeError to
        # indicate there is no underlying value
        # in which case the descriptor itself will
        # have to do
        pass

ジェネレーターとコルーチンの現状

コルーチンスケジューラを実装する場合、およびジェネレータのその他の高度な使用法の場合、ジェネレータが現在実行中であるか、開始または再開または実行を待機しているか、またはすでに終了しているかを判断すると便利です。 getgeneratorstate()を使用すると、ジェネレーターの現在の状態を簡単に判別できます。

inspect.getgeneratorstate(generator)

ジェネレータイテレータの現在の状態を取得します。

考えられる状態は次のとおりです。
  • GEN_CREATED:実行の開始を待機しています。

  • GEN_RUNNING:現在インタプリタによって実行されています。

  • GEN_SUSPENDED:現在yield式で一時停止されています。

  • GEN_CLOSED:実行が完了しました。

バージョン3.2の新機能。

inspect.getcoroutinestate(coroutine)

コルーチンオブジェクトの現在の状態を取得します。 この関数は、 async def 関数によって作成されたコルーチンオブジェクトで使用することを目的としていますが、cr_runningおよびcr_frame属性を持つコルーチンのようなオブジェクトを受け入れます。

考えられる状態は次のとおりです。
  • CORO_CREATED:実行の開始を待機しています。

  • CORO_RUNNING:現在インタプリタによって実行されています。

  • CORO_SUSPENDED:現在await式で一時停止されています。

  • CORO_CLOSED:実行が完了しました。

バージョン3.5の新機能。

発電機の現在の内部状態も照会できます。 これは主に、内部状態が期待どおりに更新されていることを確認するためのテスト目的で役立ちます。

inspect.getgeneratorlocals(generator)

ジェネレーターのライブローカル変数の現在の値へのマッピングを取得します。 変数名から値にマップする辞書が返されます。 これは、ジェネレーターの本体で locals()を呼び出すのと同じであり、すべて同じ警告が適用されます。

ジェネレータージェネレーターであり、現在フレームが関連付けられていない場合、空の辞書が返されます。 TypeError は、ジェネレーターがPythonジェネレーターオブジェクトでない場合に発生します。

バージョン3.3の新機能。

inspect.getcoroutinelocals(coroutine)

この関数は getgeneratorlocals()に似ていますが、 async def 関数によって作成されたコルーチンオブジェクトに対して機能します。

バージョン3.5の新機能。


コードオブジェクトビットフラグ

Pythonコードオブジェクトにはco_flags属性があります。これは、次のフラグのビットマップです。

inspect.CO_OPTIMIZED
コードオブジェクトは、高速ローカルを使用して最適化されます。
inspect.CO_NEWLOCALS
設定されている場合、コードオブジェクトの実行時に、フレームのf_localsに対して新しいdictが作成されます。
inspect.CO_VARARGS
コードオブジェクトには、可変の位置パラメータ(*argsのような)があります。
inspect.CO_VARKEYWORDS
コードオブジェクトには、可変キーワードパラメータ(**kwargsのような)があります。
inspect.CO_NESTED
コードオブジェクトがネストされた関数である場合、フラグが設定されます。
inspect.CO_GENERATOR
コードオブジェクトがジェネレーター関数の場合、つまりフラグが設定されます。 コードオブジェクトが実行されると、ジェネレータオブジェクトが返されます。
inspect.CO_NOFREE
空き変数またはセル変数がない場合、フラグが設定されます。
inspect.CO_COROUTINE

コードオブジェクトがコルーチン関数の場合、フラグが設定されます。 コードオブジェクトが実行されると、コルーチンオブジェクトが返されます。 詳細については、 PEP 492 を参照してください。

バージョン3.5の新機能。

inspect.CO_ITERABLE_COROUTINE

フラグは、ジェネレーターをジェネレーターベースのコルーチンに変換するために使用されます。 このフラグを持つジェネレータオブジェクトは、await式で使用でき、yield fromコルーチンオブジェクトで使用できます。 詳細については、 PEP 492 を参照してください。

バージョン3.5の新機能。

inspect.CO_ASYNC_GENERATOR

コードオブジェクトが非同期ジェネレーター関数の場合、フラグが設定されます。 コードオブジェクトが実行されると、非同期ジェネレータオブジェクトが返されます。 詳細については、 PEP 525 を参照してください。

バージョン3.6の新機能。

ノート

フラグはCPythonに固有であり、他のPython実装では定義されていない場合があります。 さらに、フラグは実装の詳細であり、将来のPythonリリースで削除または非推奨になる可能性があります。 イントロスペクションのニーズには、 inspect モジュールのパブリックAPIを使用することをお勧めします。


コマンドラインインターフェイス

inspect モジュールは、コマンドラインからの基本的なイントロスペクション機能も提供します。

デフォルトでは、モジュールの名前を受け入れ、そのモジュールのソースを出力します。 代わりに、コロンとターゲットオブジェクトの修飾名を追加することで、モジュール内のクラスまたは関数を出力できます。

--details
ソースコードではなく、指定されたオブジェクトに関する情報を出力します