Pythonにおいて関数やクラスの引数を標準ライブラリinspectモジュールを使用して取得する方法。


環境

import sys

print(sys.version)

3.9.13 | packaged by conda-forge | (main, May 27 2022, 17:01:00)
[Clang 13.0.1 ]

やり方

ここでは、scikit-learn.model_selection.KFoldを例にとる。

inspect.signature

inspect.signature関数を使用することで引数を取得できる。
inspectは標準ライブラリなのでpipやcondaによるインストールは不要。

import inspect

from sklearn.model_selection import KFold

signature = inspect.signature(KFold)
signature

<Signature (n_splits=5, *, shuffle=False, random_state=None)>

このようにinspect.Signatureオブジェクトが得られる。具体的にとる引数は、.parametersで取り出せる。

たとえば、random_stateという引数を取るかどうかを判定するには以下のように書く。

"random_state" in signature.parameters.keys()

True

これを一般化する。ある関数やクラスに特定の引数が存在するかを判定する関数は以下。

def is_argument(func, arg_name: str) -> bool:
    return arg_name in inspect.signature(func).parameters.keys()

is_argument(KFold, "random_state")

True

おまけ: デフォルトの値を取得する方法

inspect.SignatureオブジェクトはMappingProxyType(read-onlyな辞書と思えば良い)がベースになっている。

# `MappingProxyType`に関する参考
# https://qiita.com/fumitoh/items/c404018916a7cab28391
from types import MappingProxyType

isinstance(signature.parameters, MappingProxyType)

True

したがって、以下のようにして各パラメータの情報を取り出すことができる。

parameter = inspect.signature(KFold).parameters["random_state"]
parameter

<Parameter "random_state=None">

このようにinspect.Parameterオブジェクトが得られる。デフォルトの値は.defaultで取得できる。

print(parameter.default)

None

参考