获取python函数内的参数名称列表

R S*_*R S 241 python parameters

可能重复:
在python中获取方法参数名称

有没有一种简单的方法可以在python函数中获取参数名称列表?

例如:

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

>>> func()
['a','b','c']
Run Code Online (Sandbox Code Playgroud)

谢谢

sim*_*rsh 282

那么我们实际上并不需要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,)
Run Code Online (Sandbox Code Playgroud)

对于Python 2.5及以上,使用func_code替代__code__func_defaults取代__defaults__.

  • 在python3中,这将是func .__ code __.co_varnames (23认同)
  • 那是'func.func_code.co_varnames [:func.func_code.co_argcount]`因为co_varnames是函数中存在的所有变量的元组 (21认同)
  • 请使用检查。否则,您的代码在 3.4+ 中不能与 functools.wraps 很好地配合。请参阅/sf/ask/10347151/ (8认同)
  • 我使用Python 2.7.8,而`__code__`似乎被反向移植.`func_code`也仍然有效. (3认同)
  • 这只适用于非“builtin_function_or_method”。 (2认同)

小智 191

locals()(Python 2的文档,Python 3)返回一个具有本地名称的字典:

def func(a,b,c):
    print(locals().keys())
Run Code Online (Sandbox Code Playgroud)

打印参数列表.如果您使用其他局部变量,那么这些变量将包含在此列表中.但是你可以在函数的开头复制一份.

  • 谢谢!我对{place}中的{{{{{{{{{{{{{{{{{{{{{{{{{{} {{{{{{{{{ ,取{action},得到{result}".format(thing = thing,place = place,action = action,result = result) (10认同)
  • 注意,“ locals()”也返回名称空间变量,例如“ def func(a,b,c):d = 4;”。print(locals()['d'])` (4认同)
  • @speedstyle f 字符串是在 Python 3.6 中引入的。评论来自3.5。(是的,F 弦更好:D) (3认同)
  • `print locals().keys()`将返回`['arg']`.我用`print locals.get('arg')` (2认同)
  • @BrunoBronosky 为什么不直接使用 f 弦?`f'在 {place} 找到 {thing},采取 {action},产生 {result}'` (2认同)

kmk*_*lan 167

如果您还想要这些值,则可以使用该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)]
Run Code Online (Sandbox Code Playgroud)

  • [Kelly Yancey的博客](http://kbyanc.blogspot.com/2007/07/python-aggregating-function-arguments.html)有一篇很好的帖子详细解释了这一点,并给出了一个稍微更精致的版本,与,例如未知的解决方案.推荐的. (12认同)
  • 如何在装饰器中使用此功能? (2认同)

Oli*_*Oli 97

import inspect

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

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

(['a', 'b', 'c'], None, None, (5,))
Run Code Online (Sandbox Code Playgroud)

  • 你也可以在这个功能里面做 (11认同)
  • 在Python 3中使用[`inspect.signature`](https://docs.python.org/3/library/inspect.html). (5认同)
  • 这实际上更好,因为它显示了如何获取您自己没有编写的方法的参数. (4认同)
  • @UnverifiedContact 只需在函数内执行即可:-)。您可以毫无问题地访问函数名称(即递归),因此“func”中的“inspect.getargspec(func)”应该可以正常工作 (2认同)
  • @DavidC 更新了链接 [`inspect.signature`](https://docs.python.org/3/library/inspect.html#inspect.signature) (2认同)