【Python】関数の引数を取得する方法
Pythonにおいて関数やクラスの引数を標準ライブラリinspect
モジュールを使用して取得する方法。
Sponsored by Google AdSense
環境
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