获取函数参数的默认值?

新手上路,请多包涵

对于这个功能

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 许可协议

阅读 879
2 个回答

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(旧答案)

args/defaults 可以组合为:

 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 返回一个 _命名元组_。早期版本返回一个 常规的 tuple ,但相应地修改起来非常容易。这是一个适用于旧(和新)版本的版本:

 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)))

也可以工作,并且对某些人来说可能更直观。


原文由 mgilson 发布,翻译遵循 CC BY-SA 3.0 许可协议

根据您的具体需要,您可能不需要 inspect 模块,因为您可以检查 __defaults__ 函数的属性:

 >>> eat_dog.__defaults__
(True,)
>>> eat_dog.__code__.co_argcount
2
>>> eat_dog.__code__.co_varnames
('name', 'should_digest')
>>>
>>> eat_dog.__kwdefaults__
>>> eat_dog.__code__.co_kwonlyargcount
0

原文由 Chris_Rands 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏