获取Python函数的关键字参数

6
def thefunction(a=1,b=2,c=3):
    pass

print allkeywordsof(thefunction) #allkeywordsof doesnt exist

这将给出[a,b,c]。

是否有类似于allkeywordsof的函数?

我无法更改thefunction内部的任何内容。


2
如何阅读方法签名 - Xavier Combelle
可能是获取Python方法参数名称的重复问题。 - Marcin
3个回答

24

我认为你正在寻找 inspect.getargspec

import inspect

def thefunction(a=1,b=2,c=3):
    pass

argspec = inspect.getargspec(thefunction)
print(argspec.args)
产生,得出(指程序输出结果)
['a', 'b', 'c']
如果你的函数既包含位置参数又包含关键字参数,那么找到关键字参数的名称会稍微复杂一些,但并不太难:
def thefunction(pos1, pos2, a=1,b=2,c=3, *args, **kwargs):
    pass

argspec = inspect.getargspec(thefunction)

print(argspec)
# ArgSpec(args=['pos1', 'pos2', 'a', 'b', 'c'], varargs='args', keywords='kwargs', defaults=(1, 2, 3))

print(argspec.args)
# ['pos1', 'pos2', 'a', 'b', 'c']

print(argspec.args[-len(argspec.defaults):])
# ['a', 'b', 'c']

如何让它只给我参数? - user1513192
3
inspect.getargspec(thefunction).args - jamylak
4
argspec.args[-len(argspec.defaults):] 应该被接受,因为它回答了这个问题。 - jamylak
没有任何冒犯原帖作者或Ashwini的意思,但我同意这应该成为未来参考的最佳答案... - Jon Clements
1
getargspec自v3版本起已被弃用(https://docs.python.org/3/library/inspect.html#inspect.getargspec),请改用`getfullargspec`。 - nocibambi

1
你想要类似这样的东西吗:
>>> def func(x,y,z,a=1,b=2,c=3):
    pass

>>> func.func_code.co_varnames[-len(func.func_defaults):]
('a', 'b', 'c')

2
@RostyslavDzinko 是的,你说得没错,但问题在于 inspect.getargspec() 也会返回非关键字参数。 - Ashwini Chaudhary
4
@user1513192,这个回答没有解决你描述的问题。如果它符合你的需求 - 重新描述你的问题(我的上一条评论说明了原因)。 - Rostyslav Dzinko
1
@jamylak 使用了这个,因为我还没有学习过 inspect,现在肯定会学习它了。 :) - Ashwini Chaudhary
1
在Python 3中,func_code已被重命名为__code__ - naught101
func.__code__.co_varnames 也会返回本地变量。 - nocibambi
显示剩余3条评论

1

为了准确地获得您想要的内容,您可以采取以下措施。

>>> 
>>> def funct(a=1,b=2,c=3):
...     pass
... 
>>> import inspect
>>> inspect.getargspec(funct)[0]
['a', 'b', 'c']
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接