首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取函数参数的默认值?

问获取函数参数的默认值?
EN

Stack Overflow用户
提问于 2012-09-28 01:40:08
回答 6查看 28.9K关注 0票数 76

对于此函数

代码语言:javascript
复制
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的默认值

此外,我知道处理问题的“请求宽恕”模型,但不幸的是,该错误的输出不会告诉我缺少的参数的名称:

代码语言:javascript
复制
>>> 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公开模块中的函数。如果调用者省略了某些函数参数,我想返回一个特定的错误,该错误命名了被省略的特定函数参数。如果客户端省略了一个参数,但在函数签名中提供了默认值,我希望使用该默认值。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-09-28 01:46:15

Python3.x

在python3.x世界中,您可能应该使用Signature对象:

代码语言:javascript
复制
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 (旧答案)

参数/默认值可以组合为:

代码语言:javascript
复制
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返回一个命名元组。早期的版本返回一个常规的元组,但是很容易相应地修改它。这是一个适用于旧版本(和新版本)的版本:

代码语言:javascript
复制
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))

想想看:

代码语言:javascript
复制
    return dict(zip(reversed(args), reversed(defaults)))

也是可行的,而且对某些人来说可能更直观。

票数 126
EN

Stack Overflow用户

发布于 2012-09-28 01:46:14

您可以使用带有getargspec function的inspect模块

inspect.getargspec(func)

获取Python函数的参数的名称和默认值。返回一个包含四项内容的tuple:(args, varargs, keywords, defaults)。args 是参数名称的列表(它可能包含嵌套列表)。varargs和keywords是*和**参数或None的名称。如果没有默认参数,则defaults 是默认参数值或None的元组;如果该元组具有n元素,则它们对应于args中列出的最后一个n元素。

有关如何检索参数名称及其默认值的准确代码,请参阅mgilson's answer。

票数 11
EN

Stack Overflow用户

发布于 2020-01-28 18:15:39

由于可以检查函数的__defaults__属性,因此可能不需要inspect模块,具体取决于您需要的内容:

代码语言:javascript
复制
>>> 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 
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12627118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档