python - 在装饰器中访问可选参数

标签 python decorator

我正在尝试访问装饰器中传递给函数的所有参数,包括可选参数。考虑这个例子:

def decorator(fn):
    def wrapper(*args, **kwargs):
        print 'in wrapper', args, kwargs
        fn(*args, **kwargs)
    return wrapper

@decorator
def myFn(arg1, arg2, arg3=None):
    print 'in myFn', arg1, arg2, arg3

myFn(1,2)
myFn(1,2,3)

如果我运行这个,我会得到:

in wrapper (1, 2) {}
in myFn 1 2 None
in wrapper (1, 2, 3) {}
in myFn 1 2 3

在第一次运行中,由于我没有指定 3 个参数,因此出于 myFn 的目的,arg3 被定义为 None。但事实是 arg3 == None 在装饰器内部不可用,无论是在 args 还是 kwargs 中。如果我明确地将它传递给 myFn,它将显示在装饰器中,但如果我使用默认值,则无处可寻。

这是为什么?如何解决?

最佳答案

这很正常,无法“修复”...

装饰器包装器拦截传递给函数的参数和关键字:换句话说,那些由函数调用者传递给函数本身的参数和关键字。

arg3=None 是在函数范围内定义的默认参数。它不能在实际调用函数(直接或通过包装器)之前被拦截,因为此时它不存在。

但是,默认值存储在函数对象中:

def fn(arg1,arg2,arg3=None):
    pass

fn.func_defaults
-> (None,)

您可以使用以下 Get a function argument's default value?将默认值映射到参数...所以我想装饰器可以竭尽全力打印传递的参数和默认的参数。所以我想我的第一个陈述不是 100% 正确的:)

关于python - 在装饰器中访问可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22004222/

相关文章:

python - 按第二个值对元组列表进行排序,reverse=True,然后按 key,reverse=False

python - 如何抓取与特定期刊/文章论文的每位教授相关的从属关系

python - 以非 root 用户身份访问 beaglebone 上的 GPIO?

python - 如何获取Timer中使用的函数的输出

python - python请求超时。获取整个响应

Python装饰器——试图理解一个简单的例子

c# - 可序列化装饰器而不是 View 模型中的 SelectList?

python - 使用定义为实例变量的装饰器函数

python - 我们可以使用装饰器设计任何功能吗?

zend-form - Zend_Form 装饰器排序(表单元素问题之前的错误)