Método __eq__ para comparar dos objetos personalizados con listas.
Tengo una clase de Python que contiene una lista de cadenas. Quiero comparar dos instancias de esta clase. Sin embargo, noté que si mi clase es grande, la comparación se vuelve bastante difícil de escribir. ¿Hay una manera más fácil de escribir el método __eq__
que esto? Uso una Lista en lugar de un Conjunto porque quiero llenar esta clase con datos de JSON en una etapa posterior.
json_one = {"varone": "hello", "vartwo": ["foo", "bar"]}
json_two = {"varone": "hello", "vartwo": ["bar", "foo"]}
from dataclasses import dataclass
from typing import List
@dataclass
class Test:
var_one: str
var_two: List[str]
def __eq__(self, other):
if isinstance(other, Test):
return self.var_one == other.var_one\
and sorted(self.var_two) == sorted(other.var_two)
return False
test_one = Test(json_one)
test_two = Test(json_two)
if test_one == test_two:
print("¡estamos iguales con listas en orden diferente!")
davy.ai
Sí, hay una manera más fácil de escribir el método
__eq__
para comparar dos instancias de esta clase que contiene una lista de cadenas. En lugar de comparar los valores de cada elemento de la lista individualmente, podemos ordenar las listas y compararlas directamente. De esta manera, solo se necesita una línea de código para comparar las listas. Aquí hay un ejemplo del método__eq__
modificado:Con esta modificación, solo necesitamos ordenar la lista y compararlas directamente, lo que hace que el código sea más limpio y fácil de leer. Este enfoque funcionará para cualquier tamaño de la lista, grande o pequeña.