Getting list of parameter names inside python function
Possible Duplicate:
Getting method parameter names in python
有没有一种简单的方法可以进入一个python函数并获得参数名列表?
例如:
1 2 3 4 5
| def func(a,b,c):
print magic_that_does_what_I_want()
>>> func()
['a','b','c'] |
谢谢
我们真的不需要EDOCX1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| >>> 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,) |
对于Python2.5和老鼠,使用func_codeInstead of __code__和func_defaultsInstead of __defaults__
- 这是func.func_code.co_varnames[:func.func_code.co_argcount],因为co变量名是函数中所有变量的元组。
- 在python3中,这是func.uuu code_uuu.co_varnames
- 这只适用于非"内置函数"或"方法"。
- @Mikeschuldt更新了python3的答案
- 我想对于Python2/3的兼容性来说,inspect更好。
- 我使用的是python2.7.8,而__code__似乎是反向端口。func_code仍然有效。
- 它不适用于用functools.partial生成的函数。对于这些,您需要查看f.func并删除f.keyword和f.args。
- @2008年10月发布的python2.6中引入了def-os-__code__。3.0于2008年12月发布。所以我不会说它是"反向端口"——从2.6分支的3.0。只有2.7版本具有从3返回的功能。
- 代码是2.6-3.x兼容的,所以是相当可移植的
复制这个网站码到您的网站上以设置一个投票箱在您的网站上。
1 2
| def func(a,b,c):
print locals().keys() |
Prints the list of parameters.如果您使用其他本地变量,这些变量将被包括在这个列表中。但你可以在功能的初期复制一份。
- print locals().keys()返回['arg']。我用过print locals.get('arg')。
- @口水请再检查一下。@unknown的解决方案按预期打印['a', 'b', 'c'](可能不是A-B-C顺序)。你的解决方案(a)不起作用,提出一个AttributeError--也许你的意思是print locals().get('arg')?(b)如果您正试图这样做,那么它将打印参数的值,而不是按OP请求的参数名称。
- 谢谢您!我对"found {thing} in {place}, took {action}, resulting in {result}".format(**locals())有了新的爱,而不是对"found {thing} in {place}, took {action}, resulting in {result}".format(thing=thing, place=place, action=action, result=result)有了新的爱。
- 当心,locals()也返回名称空间变量,例如def func(a,b,c): d=4; print(locals()['d'])。
如果你还想要这个值,你可以使用inspect模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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)] |
- KellyYancey的博客有一篇很好的文章详细解释了这一点,并给出了一个稍微更精细的版本,plos与unbeknown的解决方案进行了比较。推荐。
- 那么def foo(first, second, third, *therest):呢?
ZZU1
- 这不在函数内部。
- 你也可以在函数内部进行
- 这实际上更好,因为它显示了如何获取方法的参数,而您没有自己编写。
- 在python3中使用inspect.signature。
- 但是,如何在函数内部完成这项工作呢?
- "默认值是默认参数值的元组,如果没有默认参数,则为无;如果此元组有n个元素,则它们对应于args中列出的最后n个元素。"文档
- @unverifiedcontact只需在函数内执行它:-)。您可以无问题地访问函数名(即递归),因此从func内的inspect.getargspec(func)应该可以正常工作。