Existe-t-il un moyen de vérifier si deux objets ont les mêmes valeurs, à l'exception de parcourir leurs attributs et de comparer manuellement leurs valeurs?Comparaison de deux objets
Répondre
solutions de Kington fonctionne si @ Joe il y a un __dict__
(certains objets, y compris builtins, n'ont pas) et __eq__
œuvres pour toutes les valeurs des deux dicts (a __eq__
des exceptions mayraise mal écrites, etc.). Mais c'est horriblement antipathique. Il ne gère pas correctement les sous-types nominaux ... beaucoup moins les sous-types structurels (c'est-à-dire les types que vous pouvez utiliser en place/pour le typage du canard). Ne faites pas cela.
Mais généralement, vous êtes mieux avec une méthode personnalisée __eq__
qui compare seulement certains attributs qui sont importants. Par exemple. Rational ne devrait comparer que le numérateur et le dénominateur, rien de plus.
"certaines comparaisons sans signification peuvent soulever des exceptions": non, ceci s'applique uniquement aux comparaisons impliquant un ordre - vérifiant si 'a' est égal à' b' (ie, 'a == b', exprimé ou implicite) ** jamais ** causes exceptions (sauf si vous codez délibérément une classe bizarre remplaçant '__eq__' dans le seul but de provoquer de telles exceptions ;-). IOW, la comparaison pour l'égalité/inégalité est ** jamais ** "sans signification". –
@Alex Ou à moins que quelqu'un d'autre code une telle classe. Les classes mal écrites se produisent assez fréquemment. Mais, delnan semblait impliquer que certains types intégrés se comportaient de cette façon, ce qui est en effet incorrect. –
Oui, les builtins ne le font pas. Désolé si c'est lu comme ça. – delnan
object1.__dict__ == object2.__dict__
devrait être tout ce dont vous avez besoin, je pense ...
Edit: vars(object1) == vars(object2)
est peut-être un peu plus pythonique, bien que @delnan fait un point valide sur les objets (par exemple int
s) qui n'ont pas __dict__
. Je ne suis pas d'accord qu'une coutume __eq__
est une meilleure approche pour les cas simples, bien que ... Parfois, ça ne vaut pas la peine d'aller au-delà de la saleté rapide et sale, si rapide et sale fait exactement ce dont vous avez besoin, i.m.h.o.
Toucher '__dict__' directement est fondamentalement toujours faux. – habnabit
@Aaron, je serais d'accord que la modification de '__dict__' directement est fondamentalement toujours fausse ... Je ne serais pas d'accord que la lecture directe soit fondamentalement toujours fausse. Peut-être que "vars" est un peu plus clair, bien que ... –
non, la lecture est fondamentalement toujours erronée. Il contourne le protocole descripteur, sans compter qu'il repose sur un détail d'implémentation. – habnabit
Pour disserter sur la réponse de delnan:
_NOTFOUND = object()
class Rational(object):
def __eq__(self, other):
for attr in ['numerator', 'denominator']:
v1, v2 = [getattr(obj, attr, _NOTFOUND) for obj in [self, other]]
if v1 is _NOTFOUND or v2 is _NOTFOUND:
return False
elif v1 != v2:
return False
return True
Vous pouvez comparer namedtuple directement.
Sinon, vous devez définir soit vos propres comparaisons riches __eq__
et peut-être __ne__
ou votre propre __cmp__
voir le datamodel pour plus d'infos
- 1. Comparaison de deux objets.
- 2. Comparaison de deux objets par deux propriétés
- 3. Comparaison rapide de deux objets Bitmap pixel par pixel
- 4. Comparaison de deux chaînes
- 5. Comparaison de deux adresses d'objet dans WinDbg
- 6. Comparaison de deux schémas XML
- 7. Comparaison de deux collections d'objets
- 8. python: comparaison de deux chaînes
- 9. comparaison de deux itérateurs end()
- 10. deux dates Comparaison mysql
- 11. Comparaison entre les objets Javascript
- 12. Comparaison des objets javascript natif avec jQuery
- 13. Comparaison de deux schémas Oracle, d'autres utilisateurs
- 14. Comparer deux objets hérités Ruby
- 15. Erreur lors de la comparaison de deux objets DateTime dans Ruby on Rails
- 16. Comparaison de deux sons de la parole
- 17. Comparaison de 2 objets à l'aide d'un tableau de descripteurs
- 18. La comparaison de deux objets qui sont les mêmes dans MbUnit
- 19. Comparaison de deux objets implémentant la même interface pour l'égalité/équivalence - Aide à la conception
- 20. Date de comparaison entre deux dates?
- 21. comparaison de deux tableaux associatifs multidimensionnels s
- 22. C# Comparaison de deux listes personnalisées
- 23. Comparaison de deux matrices dans Matlab
- 24. Comparaison par programme IL de deux méthodes
- 25. Ms Access Comparaison de deux jeux d'enregistrements
- 26. Problème dans la comparaison de deux chaînes ...!
- 27. Comparaison de deux collections en Java
- 28. Comparaison de deux fichiers sous Unix
- 29. Comparaison de deux conteneurs pour l'identité de leur contenu
- 30. fusionner deux objets de données
Voir [cette question similaire] (http://stackoverflow.com/ questions/390250/elegant-ways-to-support-equivalence-égalité-in-python-classes) – GreenMatt