Python 为什么使用decorator工厂函数是语法错误?

Python 为什么使用decorator工厂函数是语法错误?,python,syntax-error,python-decorators,Python,Syntax Error,Python Decorators,假设我有一家装饰厂。这是非常无用的,只是累积参数,并添加到结果中,但仅举一个例子: def decorator_factory_factory(a): def decorator_factory(b): def decorator(f): def decorated(*args, **kwargs): return f(*args, **kwargs) + a + b return decor

假设我有一家装饰厂。这是非常无用的,只是累积参数,并添加到结果中,但仅举一个例子:

def decorator_factory_factory(a):
    def decorator_factory(b):
        def decorator(f):
            def decorated(*args, **kwargs):
                return f(*args, **kwargs) + a + b
            return decorated
        return decorator
    return decorator_factory
我试着这样使用它:

@decorator_factory_factory(3)(1)
def should_return_5():
    return 1
我有一个语法错误。当然,它应该允许任何任意Python表达式作为装饰器

我还尝试:

@(decorator_factory_factory(3)(1))
def should_not_be_touched():
    return 1
但这是另一个语法错误

我做错什么了吗?我找到的唯一解决方法是:

_decorator_factory = decorator_factory_factory(3)
@_decorator_factory(1)
def should_not_be_touched():
    return 1
del _decorator_factory

但这需要一个需要删除的附加变量

该函数是在错误的包装器上发送的,从未调用过

def decorator_factory_factory(): 
    def decorator_factory(f):
        def decorator():
            return f()
        return decorator
    return decorator_factory

@decorator_factory_factory()
def should_not_be_touched():
    return 1

更新:从Python 3.9开始,这不再是语法错误。看


decorator语法。不允许使用任意表达式。您可以使用
接线员,并且在结束时最多只能进行一次呼叫
()
,因此

@decorator_factory_factory(3)(1)
def should_return_5():
    return 1
是一个语法错误,因为它的调用
(3)
不在末尾

实际上,这并没有那么大的限制,因为decorator只是函数声明后赋值的糖。你可以自己做,不受限制

def should_return_5():
    return 1
should_return_5 = decorator_factory_factory(3)(1)(should_return_5)
这不会创建需要删除的附加变量

此外,单个函数调用足以通过简单的标识函数潜入任意表达式

def identity(x):
    return x

@identity(decorator_factory_factory(3)(1))
def should_return_5():
    return 1

对于
identity
(而不是
id
,这是一个内置的名称),这与您想要的
@(decorator\u factory\u factory(3)(1))
语法非常接近。装饰师应该承担这个职能。该示例只是返回了未更改的函数。我希望现在的例子更清楚地说明我想做什么
decorator\u factory\u factory
现在只是一个decorator factory。您使用的Python版本是什么,@Artyer?@ChristianDean在Windows的3.6.1和2.7.13版本上运行,而默认的python2和3在Ubuntu上运行。@Ayter有趣。我这样问是因为文章的作者显然可以使用decorator-factory语法。我认为他可能使用了Python2.7,语法是有效的,但在该版本中,它没有成功。我将使用PythonV2.6进行检查。