python – 获取函数参数的默认值?

对于这个功能

def eat_dog(name, should_digest=True):
    print "ate dog named %s. Digested, too? %" % (name, str(should_digest))

我想在函数的外部读取其参数和附加的任何默认值。所以对于这个具体的例子,我想知道这个名字没有默认值(也就是说它是一个必需的参数),而True是should_digest的缺省值。

我知道inspect.getargspec(),它提供了有关参数和默认值的信息,但我看到两者之间没有连接:

ArgSpec(args = [‘name’,’should_digest’],varargs = None,keywords = None,defaults =(True,))

从这个输出中我如何知道True(在默认值tuple中)是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暴露在模块中的函数。如果调用者省略某些函数参数,我想返回一个特定的错误,该错误指定了省略的特定函数参数。如果客户端省略了一个参数,但是在函数签名中提供了一个默认值,我想使用该默认值。

最佳答案
参数/默认值可以组合为:

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 – 获取函数参数的默认值? - 代码日志