Pythonで関数の引数(パラメータ)名のリストを取得する方法
Pythonでは、関数やメソッドが受け取る引数の「数」と「名前」をプログラムから取得できます。たとえば、("arg1", "arg2") のような形式で引数名の一覧を取り出したい場合には、標準ライブラリの inspect モジュール を使用します。
以下のコードでは、inspectモジュールを使って、aMethod と foo という2つの関数内のパラメータ情報を取得しています。
サンプルコード
import inspect
def aMethod(arg1, arg2):
pass
print(inspect.getargspec(aMethod))
def foo(a, b, c=4, *arglist, **keywords):
pass
print(inspect.getargspec(foo))実行結果
ArgSpec(args=['arg1', 'arg2'], varargs=None, keywords=None, defaults=None) ArgSpec(args=['a', 'b', 'c'], varargs='arglist', keywords='keywords', defaults=(4,))
出力内容の見方
getargspec() の戻り値は、次の要素を持つオブジェクトです。
- args: 位置引数の名前のリスト
- varargs: 可変長位置引数(*args)の変数名。なければ None
- keywords: 可変長キーワード引数(**kwargs)の変数名。なければ None
- defaults: デフォルト値のタプル。デフォルト値がなければ None
この例では、foo の場合、通常の引数として a、b、c が検出され、*arglist と **keywords もそれぞれ認識されていることがわかります。
注意:getargspecは非推奨
inspect.getargspec() は古いAPIであり、Python 3系では非推奨とされ、Python 3.11で削除されました。現在のPythonでは、代わりに inspect.signature() を使うのが推奨されます。
import inspect
def foo(a, b, c=4, *arglist, **keywords):
pass
sig = inspect.signature(foo)
# 引数名だけをリストで取得
param_names = list(sig.parameters.keys())
print(param_names)
# 各パラメータの詳細を表示
for name, param in sig.parameters.items():
print(name, param.kind, param.default)実行結果
['a', 'b', 'c', 'arglist', 'keywords'] a POSITIONAL_OR_KEYWORD <class 'inspect._empty'> b POSITIONAL_OR_KEYWORD <class 'inspect._empty'> c POSITIONAL_OR_KEYWORD 4 arglist VAR_POSITIONAL <class 'inspect._empty'> keywords VAR_KEYWORD <class 'inspect._empty'>
inspect.signature() を使えば、引数名だけでなく、各パラメータの種類(位置引数・キーワード引数など)やデフォルト値も柔軟に取得でき、アノテーション付きの関数にも対応しています。新しいコードではこちらの方法を採用しましょう。
-
【Python入門】関数にデフォルト引数を設定する方法と落とし穴の回避策
Pythonにおけるデフォルト引数(デフォルトパラメータ値)の扱いは、多くの初心者がつまずきやすいポイントの一つです。問題となるのは「ミュータブル」なデフォルト値トラブルの原因になるのは、ミュータブル(可変)なオブジェクトをデフォルト値として指定するケースです。ミュータブルとは、リストや辞書のように、生成後に中身をその場で変更できるオブジェクトのことを指します。たとえば、第2引数が省略された場合に「呼び出すたびに新しいリストが作られる」と期待してコードを書くと、本来は次のような出力を想定しているはずです。[12] [43]実際に起こることしかし実際のPythonでは、リストは関数が定義された時
-
【Python入門】関数からリストを返す基本的な方法とサンプルコード
Pythonでは、関数からリストを返す方法がいくつかあります。最も基本的なのは、関数内でリストを作成し、return文でそのリストを返すという方法です。 基本例:forループでリストを生成して返す 以下の例では、0から9までの数値を順番にリストへ追加し、完成したリストを返す関数 retList() を定義しています。 def retList(): result = [] for i in range(0, 10): result.append(i) return result a = retList() print(a) 実行結果 [0, 1,