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é
Quelle version de Python utilisez-vous, @Artyer? –
@ChristianDean Happens sur 3.6.1 et 2.7.13 sur Windows, et par défaut python2 et 3 sur Ubuntu. – Artyer
@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. –