在Python上使用字典作为装饰器

时间:2018-11-21 19:40:00

标签: python function decorator wrapper

有什么方法可以使用默认的“ @” 语法将 dict 用作python上的装饰器?

就像这样:

}

如果更改为在 dict 上使用 get() ,则此功能有效,但不能执行以下操作:

from functools import wraps
def deco(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        print("WRAPPER")
        return f(*args, **kwargs)
    return wrapper

X={ "deco": deco }

# Working
@deco
def f():
    pass

# Not Working: SyntaxError: invalid syntax
@X["deco"]
def y():
    pass

f()
y()

有某种方法可以使这种语法起作用,或者为什么不起作用?

1 个答案:

答案 0 :(得分:3)

故意限制了语法。参见PEP-0318

  

decorator语句的接受能力受到限制-任意   表达式将不起作用。 Guido首选gut feeling

     

当前语法还允许装饰器声明调用   返回装饰器的函数:

email the PEP links说:

  

我对此有一种直觉。我不确定它在哪里   来自,但我有。可能是我希望编译器能够   识别某些装饰。

     

因此,虽然很容易将语法更改为@test,   未来,我想坚持使用更严格的形式,除非真正   给出了用例,其中允许@test将增加可读性。   (@foo()。bar()不计在内,因为我不希望您会需要   )。

因此,该语言的创建者/主要贡献者决定允许任何表达式充当修饰符都会导致代码难以阅读。

它也从来没有必要。您随时可以

my_deco = X.get("deco").require(http_exception=403)
@my_deco
def somefunc():
    ...