Esiste un modo per verificare se due oggetti hanno gli stessi valori, oltre a scorrere i relativi attributi e confrontare manualmente i loro valori?Confronto di due oggetti
risposta
soluzioni @ Joe Kington funziona se c'è un __dict__
(alcuni oggetti, tra cui i comandi incorporati, non hanno uno) e __eq__
opere per tutti i valori di entrambe le dicts (a scritti male __eq__
mayraise eccezioni ecc). Ma è orribilmente unpitonico. Non gestisce nemmeno i sottotipi nominali in modo appropriato ... molto meno sottotipi strutturali (cioè tipi che è possibile utilizzare sul posto/per la tipizzazione delle anatre). Non farlo.
Ma di solito si sta meglio con un metodo su misura __eq__
che confronta solo alcuni attributi significativi. Per esempio. Rational dovrebbe confrontare solo numeratore e denominatore, niente di più.
"alcune comparazioni prive di significato possono sollevare eccezioni": no, questo vale solo per i confronti che riguardano l'ordinamento - verificare se 'a' è uguale a' b' (es. 'A == b', espresso o implicito) ** mai ** causa eccezioni (a meno che non si codifichi deliberatamente una strana classe che sovrascrive '__eq__' al solo scopo di causare tali eccezioni ;-). IOW, il confronto per l'uguaglianza/disuguaglianza è ** mai ** "privo di significato". –
@Alex O a meno che qualcun altro non codifichi tale classe. Le classi scritte male compaiono piuttosto frequentemente. Ma Delnan sembrava implicare che alcuni tipi di builtin si comportassero in questo modo, il che è davvero scorretto. –
Sì, i builtin non lo fanno. Scusa se legge così. Gli oggetti – delnan
object1.__dict__ == object2.__dict__
dovrebbe essere tutto il necessario, credo ...
Edit: vars(object1) == vars(object2)
è forse un po 'più divinatorio, anche se @delnan rende un valido punto sugli oggetti (ad esempio int
i) che non hanno un __dict__
. Non sono d'accordo sul fatto che un custom __eq__
rappresenti un approccio migliore per i casi semplici, anche se ... A volte non vale la pena di andare oltre il rapido e sporco, se veloce e sporco fa esattamente ciò che ti serve, i.m.h.o.
Toccare direttamente '__dict__' è fondamentalmente sempre sbagliato. – habnabit
@Aaron, sono d'accordo sul fatto che modificare direttamente '__dict__' è fondamentalmente sempre sbagliato ... Non sono d'accordo sul fatto che leggerlo direttamente è fondamentalmente sempre sbagliato. Forse 'vars' è un po 'più chiaro, anche se ... –
no, leggere è fondamentalmente sempre sbagliato. Ignora il protocollo descrittore, per non parlare del fatto che si basa su un dettaglio di implementazione. – habnabit
di esporre sulla risposta di 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
È possibile confrontare direttamente namedtuple.
In caso contrario è necessario definire sia i propri confronti ricchi __eq__
ed eventualmente __ne__
o il proprio __cmp__
vedere la datamodel per ulteriori informazioni
- 1. Confronto di due oggetti NSNumber
- 2. Confronto di due oggetti del calendario
- 3. Confronto di due oggetti DateTime Joda-
- 4. Confronto di due oggetti con un controllo per null
- 5. Metodo comune per il confronto di due oggetti Java
- 6. Confronto oggetti VB6
- 7. Confronto di due CGRect
- 8. Confronto di due grafici
- 9. Confronto di due NSDate
- 10. PHP: confronto tra due oggetti DateTime con fusi orari diversi
- 11. Confronto di oggetti in LinkedList.contains()
- 12. Confronto oggetti in test unità
- 13. Confronto di oggetti di eccezione in Python
- 14. Confronto di oggetti dattilografati nella classe generica
- 15. Confronto oggetti classe
- 16. Confronto elementi di due array
- 17. Confronto tra due array
- 18. Confronto di matrici di oggetti in JavaScript
- 19. Core Performance dati: NSPredicate confronto di oggetti
- 20. Confronto di 2 oggetti personalizzati - C#
- 21. Confronto tra due file xml usando JAVA
- 22. correttamente implementare il confronto di due oggetti di tipo diverso ma semanticamente equivalenti
- 23. Confronto tra due strutture usando ==
- 24. che compone due funzioni di confronto?
- 25. Confronto di due array in Ruby
- 26. NumPy: confronto di elementi in due array
- 27. Confronto di due matrici in Matlab
- 28. Confronto di due volti in Android
- 29. Confronto di due raccolte in Java
- 30. Confronto di due elenchi in Python
Sede [questa domanda simile] (http://stackoverflow.com/ domande/390250/classi elegante-way-to-support-equivalence-ugality-in-python) – GreenMatt