为什么下面的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
的值应为装饰器,并在其后跟随一个函数或类定义或另一个@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
那为什么不是顶部的那个呢?
答案 0 :(得分:2)
由于这是一个语法错误,我们必须转到语法:
decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
@
之后的部分不是任意表达式;它是带有一个可选参数列表的单个名称。
我意识到这不能回答为什么这样写语法的问题,但是除了“就是这样”之外,我没有其他答案。