python教程—获取函数参数的默认值?-Python实用宝典

python教程—获取函数参数的默认值?

对于这个函数,我想在函数外部读取它的参数和任何附加的默认值。因此,对于这个特定的示例,我想知道name没有默认值(即它是必需的参数),True是should_digest的默认值。

对于这个函数

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

我想在函数外部读取它的参数和任何附加的默认值。因此,对于这个特定的示例,我想知道name没有默认值(即它是必需的参数),True是should_digest的默认值。

我知道check .getargspec(),它确实给了我关于参数和默认值的信息,但我没有看到两者之间的联系:

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

从这个输出中我如何知道True(在默认元组中)是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。您可能应该使用一个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/默认值可以组合为:

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

对某些人来说可能更直观。


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论