对于这个功能
def eat_dog(name, should_digest=True):
print "ate dog named %s. Digested, too? %" % (name, str(should_digest))
我想在函数外部读取它的参数和任何附加的默认值。所以对于这个特定的例子,我想知道 name
没有默认值(即它是一个必需的参数)并且 True
是 的默认值should_digest
.
我知道 inspect.getargspec()
,它确实为我提供了有关参数和默认值的信息,但我发现两者之间没有任何联系:
ArgSpec(args=['name', 'should_digest'], varargs=None, keywords=None, defaults=(True,))
从这个输出我怎么知道 True
(在 defaults
元组中)是 should_digest
的默认值?
此外,我知道解决问题的“请求宽恕”模型,但不幸的是,该错误的输出不会告诉我缺少的参数的名称:
>>> eat_dog()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: eat_dog() takes at least 1 argument (0 given)
为了提供上下文(我为什么要这样做),我通过 JSON API 公开模块中的函数。如果调用者省略了某些函数参数,我想返回一个特定的错误来命名被省略的特定函数参数。如果客户端省略了参数,但函数签名中提供了默认值,我想使用该默认值。
最佳答案
Python3.x
在 python3.x 世界中,您可能应该使用 Signature
对象:
import inspect
def get_default_args(func):
signature = inspect.signature(func)
return {
k: v.default
for k, v in signature.parameters.items()
if v.default is not inspect.Parameter.empty
}
Python2.x(旧答案)
参数/默认值可以组合为:
import inspect
a = inspect.getargspec(eat_dog)
zip(a.args[-len(a.defaults):],a.defaults)
这里 a.args[-len(a.defaults):]
是具有默认值的参数,显然 a.defaults
是对应的默认值。
您甚至可以将 zip
的输出传递给 dict
构造函数,并创建一个适合关键字解包的映射。
查看文档,此解决方案仅适用于 python2.6 或更高版本,因为我假设 inspect.getargspec
返回一个 命名元组。早期版本返回一个正则元组,但它会很容易进行相应的修改。这是一个适用于旧(和新)版本的版本:
import inspect
def get_default_args(func):
"""
returns a dictionary of arg_name:default_values for the input function
"""
args, varargs, keywords, defaults = inspect.getargspec(func)
return dict(zip(args[-len(defaults):], defaults))
想一想:
return dict(zip(reversed(args), reversed(defaults)))
也可以,而且对某些人来说可能更直观。
关于python - 获取函数参数的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12627118/