Czesc, mam taki pytanie. Napisałem klasę która tworzy kolejke i jestem w trakcie pisania testów. Załóżmy że w kolejce q mam jeden element o wartosci 1. Czemu podczas testu q == [1] wyrzuca mi false? Kolejka jest tworzona jako lista.
Porównywanie instacji klasy do listy
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1620
W Pythonie == bazuje na metodzie __eq__, której domyślna implementacja sprawdza najpierw, czy oba obiekty są tej samej klasy — a Twoja własna klasa to nie to samo, co wbudowana klasa listy.
Jeśli chcesz dokonywać takich porównań, przeciąż tę metodę.
EDYCJA: istotna lektura: __hash__ i jak się to ma do __eq__
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Warszawa 🐪
- Postów: 1719
Rzemysł napisał(a):
Napisałem klasę
Chciałbym zobaczyć kod, który uruchamiasz. Kolega w odpowiedzi wyżej ma rację, ale ja chciałbym się upewnić czy piszecie o tym samym.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 20
Kod:
class Queue:
def __init__(self):
self._k = []
def empty(self):
return self._k== []
def detach(self):
front = self._k[0]
self._k.pop(0)
return front
def attach(self, x):
self._k.append(x)
def front(self):
return self._k[0]
def __str__(self):
return str(self._k)
def test():
q = Queue()
q.attach(150)
print(q == [150])
test()
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1620
Zatem jeśli jest to tylko na potrzeby testu, to możesz porównywać q._k z [150]. Nie jest to może najlepszy test świata, bo polega mocno na szczegółach implementacyjnych, ale zadziała…
Inne rozwiązania to:
- Przeciążenie
__eq__, jak wyżej. - Dodanie metody
to_list, która będzie zwracała zawartość kolejki jako listy i testowanie tego. - Testowanie czy
frontzwróci to, co trzeba.
Ogólnie — w testach chcesz, niemal zawsze, badać poprawność zewnętrznych interfejsów klas, nie ich wewnętrzne działanie. To, co klasa będzie miała „w środku”, jaką listę (i czy w ogóle listę), to szczegół implementacyjny — coś, czego testować nie powinieneś. Ty chcesz na przykład sprawdzać, czy jak coś włożysz attach, a potem wyjmiesz detach, to będzie to samo: bo wtedy testujesz zachowanie klasy, jej interfejs. Czyli jedyne, co tak naprawdę interesuje użytkowników.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 5025
Nadpisz chociaż __eq__, __repr__ i indeksowanie (__get__), żeby to jakoś wyglądało :), a tu:
https://rszalski.github.io/magicmethods/
Masz czytankę o tzw. "magic methods".
- Rejestracja: dni
- Ostatnio: dni
Dequeue powinno być O(1). U Ciebie jest O(n).