python - Python 装饰器中的语法错误

标签 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声明:

@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/

相关文章:

zend-form - 如何更改 Zend_Form 中默认错误装饰器的标签?

python - 使用定义为实例变量的装饰器函数

python - pip 命令问题 - 命令 "python setup.py egg_info"失败,错误代码为 1 in/private/tmp/pip-build-7n_jim1n/mysql-python/

python - 导入错误 : Environment variable DJANGO_SETTINGS_MODULE is undefined

xaml - 如何在 XAML/通用 Windows 应用程序中使用类型引用?

syntax - 此Assign语句中的语法有什么问题?

python - 是否可以从函数返回字典或系列以及数据帧?

Python:是否有语法级支持从元组中解包到*匿名*函数的参数?

c - 宏数组访问的语法错误

Python 函数装饰器调用