为什么下面的Python代码片段是这样的:
def f():
def g():
def h(x):
pass
return h
return g
@f()()
def i():
pass
引发SyntaxError
?
@f()()
^
SyntaxError: invalid syntax
因为据我了解,装饰器是具有单个所需位置参数的可调用对象,也就是说这些是有效的装饰器:
def f(x):
pass
def g(x, y=3):
pass
class A:
def __init__(self, x):
pass
class B:
def __init__(self, x, y=3):
pass
它们的用途是:
def h():
pass
h = f(h)
h = g(h)
h = A(h)
h = B(h)
class C:
pass
C = f(C)
C = g(C)
C = A(C)
C = B(C)
或者通过@expression
语句,其中表达式
应该评估为装饰器,并且后面应该跟一个函数或类定义或另一个@expression
声明:
@f
def h():
pass
@g
def h():
pass
@A
def h():
pass
@B
def h():
pass
@f
class C:
pass
@g
class C:
pass
@A
class C:
pass
@B
class C:
pass
以下@expression
语句完全有效:
def f():
def g():
def h(x):
pass
return h
return g
def g(x):
def h(x):
pass
return g
@g(f()())
def h():
pass
那么为什么顶部的那个不是呢?
最佳答案
既然是语法错误,我们就得去看看语法:
decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
@
后面的部分不是任意表达式;它是一个带有一个可选参数列表的单一名称。
我意识到这并不能回答为什么语法是这样写的问题,但除了“事情就是这样”之外我没有任何答案。
关于python - Python 装饰器中的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56490579/