对于这个功能
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 在模块中公开函数。如果调用者省略了某些函数参数,我想返回一个特定的错误来命名被省略的特定函数参数。如果客户省略了参数,但函数签名中提供了默认值,我想使用该默认值。
原文由 skyler 发布,翻译遵循 CC BY-SA 4.0 许可协议
Python3.x
在 python3.x 世界中,您可能应该使用
Signature
对象:Python2.x(旧答案)
args/defaults 可以组合为:
这里
a.args[-len(a.defaults):]
是具有默认值的参数,显然a.defaults
是相应的默认值。您甚至可以将
zip
的输出传递给dict
构造函数并创建适合关键字解包的映射。查看文档,此解决方案仅适用于 python2.6 或更新版本,因为我假设
inspect.getargspec
返回一个 _命名元组_。早期版本返回一个 常规的 tuple ,但相应地修改起来非常容易。这是一个适用于旧(和新)版本的版本:想一想:
也可以工作,并且对某些人来说可能更直观。