Pourquoi ne pas les deux scripts suivants équivalents?
3 Réponses :
La raison est parce que enveloppé () à l'intérieur de Makebold n'accepte aucun argument.
Lorsque vous utilisez le décorateur comme celui-ci, cela peut causer des problèmes, je posterai un exemple de comment réaliser ce que vous voulez cependant, donnez-moi un instant. P>
Voici un travail Exemple de ce dont vous avez besoin. p> Voici la sortie du script ci-dessus: p> Notez que Makebold est le seul décorateur récursif. Notez également la différence subtile de l'usage: makbold code> est un peu laids, mais il vous montre comment écrire un décorateur qui peut éventuellement envelopper un autre décorateur. < / p>
@makebold () code> vs
@makeitalic code>. p> p>
-1 ... trop complexe et "matitalique" est un mauvais nom pour quelque chose qui fait audacieux + italique. Voir Cette réponse qui fait la même chose dans quelques lignes de code.
Le problème est de remplacer "matitalique" (qui prend un argument) avec le "Chanmage" "-La -fonction" - Makebold "qui prend zéro argument.
Utiliser * args, ** kwargs code> à transmettre des arguments plus loin dans la chaîne: p>
Le problème est un peu plus sévère que cela. Enveloppement d'un autre décorateur a quelques problèmes supplémentaires.
Le problème avec le deuxième exemple est que
def makeitalic(fn): @makebold def wrapped(): return "<i>" + fn() + "</i>" return wrapped
+1 Cela souligne exactement le problème et comment cela doit être fait à la place. Fondamentalement, le problème provient de décorateurs de pensée faire la composition de fonction - mais ils ne font pas.
Yup c'est exactement ce que j'essayais de faire, et oui j'ai mal compris que les décorateurs == Composition fonctionnelle
Bonne question. J'ai couru dans le même scénario il y a quelques mois en faisant mon propre décorateur de tentatives. Il a fallu un décompte de nouvelle rétraction. Le problème se présentait donc un peu différent du vôtre, mais avait les mêmes solutions que celle observée ci-dessous.