8
votes

Pourquoi les décorateurs Python ne peuvent-ils pas être enchaînés sur des définitions?


1 commentaires

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.


3 Réponses :


1
votes

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.

Voici un travail Exemple de ce dont vous avez besoin. xxx

makbold est un peu laids, mais il vous montre comment écrire un décorateur qui peut éventuellement envelopper un autre décorateur. < / p>

Voici la sortie du script ci-dessus: xxx

Notez que Makebold est le seul décorateur récursif. Notez également la différence subtile de l'usage: @makebold () vs @makeitalic .


1 commentaires

-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.



0
votes

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 à transmettre des arguments plus loin dans la chaîne: xxx


1 commentaires

Le problème est un peu plus sévère que cela. Enveloppement d'un autre décorateur a quelques problèmes supplémentaires.



9
votes

Le problème avec le deuxième exemple est que

def makeitalic(fn):
    @makebold
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped


2 commentaires

+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