为什么以下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
那么为什么顶部的不是呢?
由于这是语法错误,因此我们必须转到语法:
decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
之后的部分@
不是任意表达式;它是一个带有一个可选参数列表的单一名称。
我意识到这并不能回答为什么这样写语法的问题,但是除了“就是那样”之外,我没有其他答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句