web-dev-qa-db-ja.com

Python関数内のパラメーター名のリストを取得する

可能性のある複製:
Pythonでメソッドパラメーター名を取得

Python関数の内部にいて、パラメータ名のリストを取得する簡単な方法はありますか?

例えば:

def func(a,b,c):
    print magic_that_does_what_I_want()

>>> func()
['a','b','c']

ありがとう

222
R S

値も必要な場合は、inspectモジュールを使用できます

import inspect

def func(a, b, c):
    frame = inspect.currentframe()
    args, _, _, values = inspect.getargvalues(frame)
    print 'function name "%s"' % inspect.getframeinfo(frame)[2]
    for i in args:
        print "    %s = %s" % (i, values[i])
    return [(i, values[i]) for i in args]

>>> func(1, 2, 3)
function name "func"
    a = 1
    b = 2
    c = 3
[('a', 1), ('b', 2), ('c', 3)]
162
kmkaplan

実際、ここではinspectは必要ありません。

>>> func = lambda x, y: (x, y)
>>> 
>>> func.__code__.co_argcount
2
>>> func.__code__.co_varnames
('x', 'y')
>>>
>>> def func2(x,y=3):
...  print(func2.__code__.co_varnames)
...  pass # Other things
... 
>>> func2(3,3)
('x', 'y')
>>> 
>>> func2.__defaults__
(3,)

Python 2.5以前では、func_codeの代わりに__code__を使用し、func_defaultsの代わりに__defaults__を使用します。

257
simplyharsh

locals()Python 2Python のドキュメント)は、ローカル名の辞書を返します:

def func(a,b,c):
    print locals().keys()

パラメータのリストを出力します。他のローカル変数を使用する場合、それらはこのリストに含まれます。ただし、関数の最初にコピーを作成できます。

177
unbeknown
import inspect

def func(a,b,c=5):
    pass

inspect.getargspec(func)  # inspect.signature(func) in Python 3

(['a', 'b', 'c'], None, None, (5,))
92
Oli