Python装饰器中的SyntaxError

马吉格罗

为什么以下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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章