J'aime bien réutiliser les opérateurs, mais j'ai fait ça assez rapidement, donc la pertinence est celle d'un truc pondu en vingt minutes.
Le ~chifumi est pratique et plutôt lisible, comme ça on normalise tout le temps.
Par contre réutiliser la classe chifumi pour qu'elle représente une choix ou un résultat d'affrontement, c'est plutôt moche, ça rendrait illisible un code plus gros, et c'est totalement lié à la présentation de la seconde partie du problème après la résolution de la première : comment bricoler vite fait du code qui répond à la question. C'était plus simple de rajouter un opérateur à une classe existante que de gérer une nouvelle classe.
Mais en plus propre on pourrait avoir une classe resultat d'affrontement, qui sait se multiplier (par exemple) avec une classe chifumi, avec __mul__ et __rmul__, pour pouvoir faire chifumi * resultat = resultat * chifumi = "mais qu'a donc joué mon adversaire ?"
On apprends à resultat à se multiplier dans les deux sens avec chifumi sans que celle-ci sache comment se multiplier avec resultat.
On pourrait garder le même opérateur partout, et faire du __mod__ et __rmod__ sur resultat. Sachant que dans tous les cas on retourne un score qui est un entier et n'a rien à voir avec aucune des deux classes.
Pour le total_ordering, c'est vrai, mais en pratique j'ai implémenté __lt__ qui n'est jamais utilisé. J'aurais pu nettoyer ça du code avant de le poster.
[^] # Re: En Python bref
Posté par Yth (Mastodon) . En réponse au message Avent du Code, jour 2. Évalué à 3.
J'aime bien réutiliser les opérateurs, mais j'ai fait ça assez rapidement, donc la pertinence est celle d'un truc pondu en vingt minutes.
Le
~chifumiest pratique et plutôt lisible, comme ça on normalise tout le temps.Par contre réutiliser la classe
chifumipour qu'elle représente une choix ou un résultat d'affrontement, c'est plutôt moche, ça rendrait illisible un code plus gros, et c'est totalement lié à la présentation de la seconde partie du problème après la résolution de la première : comment bricoler vite fait du code qui répond à la question. C'était plus simple de rajouter un opérateur à une classe existante que de gérer une nouvelle classe.Mais en plus propre on pourrait avoir une classe
resultatd'affrontement, qui sait se multiplier (par exemple) avec une classechifumi, avec__mul__et__rmul__, pour pouvoir fairechifumi * resultat = resultat * chifumi = "mais qu'a donc joué mon adversaire ?"On apprends à
resultatà se multiplier dans les deux sens avecchifumisans que celle-ci sache comment se multiplier avecresultat.On pourrait garder le même opérateur partout, et faire du
__mod__et__rmod__surresultat. Sachant que dans tous les cas on retourne un score qui est un entier et n'a rien à voir avec aucune des deux classes.Pour le total_ordering, c'est vrai, mais en pratique j'ai implémenté
__lt__qui n'est jamais utilisé. J'aurais pu nettoyer ça du code avant de le poster.