2017-09-16 3 views
1

Je viens d'écrire un script de test pour un projet que j'ai en python, et j'ai appris que vérifier si les valeurs de deux objets sont équivalents n'est pas aussi simple que foo == bar. Par exemple, j'ai un objet dashboard qui a une trame de données de pandas géants comme un attribut, donc je défini sa méthode __eq__ comme:Existe-t-il une méthode générale pour tester si les attributs de deux objets sont équivalents en Python?

def __eq__(self, other): 
    vals = [self.__dict__[k] == other.__dict__[k] for k in self.__dict__.keys()] 
    vals = [v if isinstance(v, bool) else all(v) for v in vals] 
    return all(vals) 

Il compare les dictionnaires de chaque objet, et si l'une de ces comparaisons cède autre chose que un booléen (par exemple, une image) il applique all() pour le réduire à un seul booléen. J'applique ensuite all() à cette liste complète de comparaisons d'attributs pour vérifier si tous les attributs self et other sont équivalents.

J'utilisé cette définition __eq__ dans plusieurs classes, et aussi utilisé quelque chose de similaire pour une méthode de comparaison dans ma classe de test parent. J'ai réussi mon test, mais je suis curieux de savoir s'il existe une façon plus élégante/efficace de gérer cela. (Avertissement: Test est nouveau pour moi, ainsi que la POO en général.)

+0

vous parlez des tests: vous devez utiliser un framework de test comme UnitTest ou Pytest; ceux-ci ont beaucoup de fonctions intégrées pour faire ce genre de choses. – MrE

Répondre

0

Non, il n'y a pas de méthode générale pour tester l'égalité des objets. Ceci est dû en partie au fait que les objets personnalisés/arbitraires ont des interprétations très différentes de ce que signifie l'égalité. Par exemple, dans votre code, vous avez défini l'égalité comme signifiant "les valeurs sont des booléens et/ou des itérables de booléens et toutes les valeurs sont d'accord", mais cette règle s'applique UNIQUEMENT aux clés que les deux dictionnaires ont en commun. Quelqu'un d'autre pourrait avoir besoin de vérifier qu'un dictionnaire a toutes les mêmes clés mais ne se soucie pas des valeurs, ou que toutes les clés et toutes les valeurs sont identiques et de types de données spécifiques, etc. Donc, c'est à l'utilisateur d'implémenter.