2017-06-04 58 views
0

说我有一个装饰工厂工厂。这是很没用,只是积累的论点,并增加了结果,但只是一个例子:为什么使用装饰工厂的工厂函数出现语法错误?

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 

我得到一个SyntaxError。当然,它应该允许任何Python表达式作为装饰器?

我也试过:

@(decorator_factory_factory(3)(1)) 
def should_not_be_touched(): 
    return 1 

但这是另一个的SyntaxError。

我做错了什么?我围绕着这一发现的唯一的方法是:

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

但这需要需要删除

+0

什么版本的一个额外的变量你在使用Python,@Artyer? –

+0

@ChristianDean适用于Windows上的3.6.1和2.7.13,以及Ubuntu上的默认python2和3。 – Artyer

+0

@过于有趣。我问,因为显然[本](http://concisionandconcinnity.blogspot.com/2010/09/decorator-factories-and-decorator.html)文章的作者可以使用装饰工厂的工厂语法。我认为他可能一直在Python 2.7中使用语法,但是在那个版本上失败了。我将使用Python v2.6来检查。 –

回答

0

功能是发送的错误的包装,从来没有叫

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 
+0

装饰工厂不应该采取这种功能。装饰者应该采取的功能。该示例刚刚返回该函数不变。我希望这个例子现在更清楚我想做什么。 'decorator_factory_factory'现在只是一个装饰工厂。 – Artyer