Objecten weergeven en vergelijken · oefening
Orden alleen als het past
Hashing beantwoordt of een waarde in een set of dictionary kan worden gevonden. Ordening beantwoordt een afzonderlijke vraag: welke van twee waarden komt eerst?
sorted() heeft een ordening nodig en < op een nieuwe klasse gooit standaard een exceptie op:
class Points:
def __init__(self, amount):
self.amount = amount
sorted([Points(5), Points(1), Points(3)])
Een natuurlijke volgorde hoort bij de waarde
Points heeft één onbetwiste volgorde: drie punten is minder dan vijf punten. Definieer __lt__, dat Python gebruikt voor < en sorteren:
NotImplemented teruggeven voor een ander type geeft Python de mogelijkheid de andere operand te proberen en uiteindelijk een bruikbare TypeError op te gooien.
Een situatiegebonden volgorde hoort bij de aanroep
Een Question heeft niet één natuurlijke volgorde. Het ene rapport wil de goedkoopste vraag eerst; het andere wil alfabetische vraagteksten. Geen van beide is de vaste betekenis van question_a < question_b.
Gebruik een sleutelfunctie op de plek waar je sorteert:
De aanroep zegt wat deze specifieke volgorde betekent en laat een andere aanroeper vrij om anders te kiezen.
Een rapport moet vragen van goedkoop naar duur tonen. Wat is het betere hulpmiddel?
Definieer __lt__ alleen als één ordening echt bij de betekenis van de waarde hoort. Houd de volgorde anders expliciet met een sleutel.
De oefening past beide beslissingen toe: Points krijgt de natuurlijke volgorde, terwijl Question ongeordend blijft en een rapportfunctie de vragen op punten sorteert.
Opdracht
Voeg alleen de ordening toe die echt bij elke waarde hoort.
Geef Points een __lt__ die de hoeveelheid vergelijkt en NotImplemented teruggeeft voor een ander type. sorted() moet dan een lijst met Points zonder sleutel kunnen ordenen.
Geef Question geen ordeningsmethode. Schrijf by_points(questions), dat een nieuwe lijst teruggeeft die met een sleutelfunctie van goedkoop naar duur is gesorteerd. Laat de oorspronkelijke lijst ongewijzigd.