有什么方法可以使用默认的“ @” 语法将 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()
有某种方法可以使这种语法起作用,或者为什么不起作用?
答案 0 :(得分:3)
故意限制了语法。参见PEP-0318:
decorator语句的接受能力受到限制-任意 表达式将不起作用。 Guido首选gut feeling。
当前语法还允许装饰器声明调用 返回装饰器的函数:
我对此有一种直觉。我不确定它在哪里 来自,但我有。可能是我希望编译器能够 识别某些装饰。
因此,虽然很容易将语法更改为@test, 未来,我想坚持使用更严格的形式,除非真正 给出了用例,其中允许@test将增加可读性。 (@foo()。bar()不计在内,因为我不希望您会需要 )。
因此,该语言的创建者/主要贡献者决定允许任何表达式充当修饰符都会导致代码难以阅读。
它也从来没有必要。您随时可以
my_deco = X.get("deco").require(http_exception=403)
@my_deco
def somefunc():
...