2017-06-04 3 views
0

Angenommen, ich habe eine Dekorateurfabrik. Es ist ziemlich nutzlos, nur die Argumente Akkumulieren und Addieren der Ergebnisse, sondern nur für ein Beispiel:Warum wird bei der Verwendung von Decorator Factory Factory ein Syntaxfehler angezeigt?

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 

Und ich versuche es so zu verwenden:

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

ich einen Syntax bekommen. Sicherlich sollte es jeden beliebigen Python-Ausdruck als Dekorator zulassen?

ich auch versucht:

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

aber dies war eine weitere Syntax.

Mache ich etwas falsch? Die einzige Art, wie ich um diese gefunden haben, ist:

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

Aber dies erfordert eine zusätzliche Variable, die

+0

Welche Version genannt von Python benutzt du @Artyer? –

+0

@ChristianDean passiert auf 3.6.1 und 2.7.13 unter Windows und die Standard-Python2 und 3 auf Ubuntu. – Artyer

+0

@Ayter Interessant. Ich fragte, weil, weil anscheinend der Autor von [dieser] (http://concisionandconcinnity.blogspot.com/2010/09/decorator-factories-and-decorator.html) Artikel die Dekoratorfabrik-Fabriksyntax verwenden könnte. Ich dachte, er hätte Python 2.7 benutzt, wo die Syntax funktionierte, aber es scheiterte an dieser Version. Ich werde das mit Python v2.6 überprüfen. –

Antwort

0

die Funktion gelöscht werden muss, auf falschen Wrapper senden und nie

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

Eine Dekorateurfabrik sollte die Funktion nicht übernehmen. Der Dekorateur sollte die Funktion übernehmen. Das Beispiel hat die Funktion nur unverändert zurückgegeben. Ich hoffe, das Beispiel ist jetzt klarer für das, was ich tun möchte. 'Decorator_Factory_Factory' ist jetzt nur eine Decorator Factory. – Artyer

Verwandte Themen