对于这个功能
def eat_dog(name, should_digest=True):
print "ate dog named %s. Digested, too? %" % (name, str(should_digest))
Run Code Online (Sandbox Code Playgroud)
我希望,在函数外部,读取它的参数和附加的任何默认值.所以对于这个具体的例子,我想知道它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)
Run Code Online (Sandbox Code Playgroud)
为了给出上下文(为什么我要这样做),我通过JSON API在模块中公开函数.如果调用者省略了某些函数参数,我想返回一个特定的错误,该错误命名了省略的特定函数参数.如果客户端省略了参数,但函数签名中提供了默认值,我想使用该默认值.
我在下面运行了一个装饰器演示。
def logger(func):
def inner(*args, **kwargs):
print(args)
print(kwargs)
return func(*args, **kwargs)
return inner
@logger
def foo1(a, b, c, x=2, y=1):
print(x * y)
foo1(6,7,8)
Run Code Online (Sandbox Code Playgroud)
输出是:
(6, 7, 8)
{}
2
Run Code Online (Sandbox Code Playgroud)
为什么字典是空的?我认为应该是{'x':2, 'y':1}