是否可以使用默认的“@”语法在python上使用作为装饰器?
比如:
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()如果更改为在dict上使用get(),这是可行的,但是这样的操作不会:
# Not working: SyntaxError: invalid syntax
@X.get("deco").require(http_exception=403)
def y():
pass这种语法工作有某种方式或/为什么不起作用?
发布于 2018-11-21 19:52:09
语法受到有意限制。请参阅佩普-0318
修饰器语句在它可以接受的内容上是有限的--任意表达式将无法工作。Guido更喜欢这样做,因为它是一个肠感觉。 当前语法还允许装饰器声明调用返回装饰器的函数:
我对这件事有直觉。我不知道它是从哪里来的,但我有。可能我希望编译器能够识别某些修饰器。 因此,尽管将来将语法更改为@test很容易,但我想坚持使用更受限制的形式,除非提供了一个真正的用例,允许@test将提高可读性。(@foo().bar()不算,因为我不认为您会需要这个)。
因此,该语言的创建者/主要贡献者决定,允许任何表达式充当修饰器将导致难以阅读代码。
这也是不必要的。你总能做到
my_deco = X.get("deco").require(http_exception=403)
@my_deco
def somefunc():
...https://stackoverflow.com/questions/53419421
复制相似问题