Python の inspect モジュールで関数を調べる

inspect モジュールを使うと、関数のシグネチャや引数情報、ソースコードなどを動的に取得できます。

シグネチャの取得

import inspect

def greet(name: str, greeting: str = "Hello") -> str:
    """挨拶を返す"""
    return f"{greeting}, {name}!"

sig = inspect.signature(greet)
print(sig)  # (name: str, greeting: str = 'Hello') -> str

パラメータの詳細

各パラメータの情報を個別に取得できます。

for param_name, param in sig.parameters.items():
    print(f"名前: {param_name}")
    print(f"  デフォルト: {param.default}")
    print(f"  アノテーション: {param.annotation}")
    print(f"  種類: {param.kind}")

パラメータの種類(kind)は以下の値を取ります。

POSITIONAL_ONLY位置専用引数(/ の前)
POSITIONAL_OR_KEYWORD通常の引数
VAR_POSITIONAL*args
KEYWORD_ONLYキーワード専用引数(* の後)
VAR_KEYWORD**kwargs

ソースコードの取得

source = inspect.getsource(greet)
print(source)

関数の定義全体を文字列として取得できます。ただし、対話モードや exec で定義した関数には使えません。

その他の便利な関数

print(inspect.getfile(greet))       # 定義ファイルのパス
print(inspect.getmodule(greet))     # モジュールオブジェクト
print(inspect.isfunction(greet))    # True
print(inspect.iscoroutinefunction(greet))  # False

inspect モジュールは、デバッグ、ドキュメント生成、フレームワーク開発など、関数を動的に扱う場面で活躍します。