2017-06-04 1 views
0

Dites que j'ai une usine d'usine de décorateur. Il est tout à fait inutile, juste accumuler les arguments, et en ajoutant aux résultats, mais juste un exemple:Pourquoi utilise-t-il une erreur de syntaxe dans les fonctions d'usine d'usine de décoration?

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 

Et j'essaie de l'utiliser comme ceci:

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

je reçois un SyntaxError. Sûrement il devrait permettre n'importe quelle expression de Python arbitraire en tant que décorateur?

J'ai essayé aussi:

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

mais ce fut une autre SyntaxError.

Est-ce que je fais quelque chose de mal? La seule façon que j'ai trouvé autour de c'est:

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

Mais cela nécessite une variable supplémentaire qui doit être supprimé

+0

Quelle version de Python utilisez-vous, @Artyer? –

+0

@ChristianDean Happens sur 3.6.1 et 2.7.13 sur Windows, et par défaut python2 et 3 sur Ubuntu. – Artyer

+0

@Ayter Intéressant. J'ai demandé parce que, apparemment, l'auteur de [cet article (http://concisionandconcinnity.blogspot.com/2010/09/decorator-factories-and-decorator.html) pourrait utiliser la syntaxe d'usine de décorateur usine. Je pensais qu'il aurait pu utiliser Python 2.7 où la syntaxe a fonctionné, mais il a échoué sur cette version à. Je vais vérifier en utilisant Python v2.6. –

Répondre

0

la fonction a été envoyé sur le mauvais emballage et n'a jamais appelé

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

Une usine de décorateurs ne devrait pas prendre la fonction. Le décorateur devrait prendre la fonction. L'exemple vient de retourner la fonction inchangée. J'espère que l'exemple est plus clair maintenant pour ce que je voudrais faire. 'decorator_factory_factory' est maintenant juste une usine de décorateur. – Artyer