Python装饰器中的SyntaxError

时间:2019-06-07 08:21:20

标签: python syntax-error decorator

为什么下面的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

那为什么不是顶部的那个呢?

1 个答案:

答案 0 :(得分:2)

由于这是一个语法错误,我们必须转到语法:

decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE

@之后的部分不是任意表达式;它是带有一个可选参数列表的单个名称。

我意识到这不能回答为什么这样写语法的问题,但是除了“就是这样”之外,我没有其他答案。