Uso molto le classi namedtuple. Oggi ho pensato se c'è un buon modo per implementare l'ordinamento personalizzato per una classe del genere, cioè rendere la chiave di ordinamento predefinita non il primo elemento (quindi il secondo, il terzo, ecc.) Della namedtuple.Ordinamento personalizzato su una classe namedtuple
Il mio primo istinto è stato quello di implementare __lt__
e __eq__
e lasciare total_ordering
fanno il resto (che riempie le, NE, GT, GE):
from collections import namedtuple
from functools import total_ordering
@total_ordering
class B(namedtuple('B', 'x y')):
def __lt__(self, other):
return self.y < other.y
Tuttavia:
def test_sortingB():
b1 = B(1, 2)
b2 = B(2, 1)
assert b2 < b1 # passes
assert b2 <= b1 # fails
oh, a destra ... total_ordering
compila solo gli altri metodi if they are missing. Dato che tuple/namedtuple ha metodi simili, total_ordering non sta facendo nulla per me.
Quindi credo che le mie opzioni sono
- arresto utilizzando namedtuple e solo costruire il mio classe noiosa, continuare ad usare total_ordering
- continuare ad usare namedtuple e implementare tutti i 6 metodi di confronto
- continuare ad usare namedtuple ed inserto un valore di ordinamento come primo campo. Fortunatamente non ho troppe istanze della classe, ma di solito mi baso sull'ordine dei campi per inizializzarli che potrebbero essere cattivi. Forse è una cattiva abitudine.
Suggerimenti sul modo migliore per risolvere questo?
Perché non si crea semplicemente il namedtuple con i campi nell'ordine in cui si desidera ordinare? – BrenBarn
Non mi sono reso conto che avrei voluto smistare/max fino a quando non l'avessi già creato e usato per un po '. Quindi potrei aggiungere un campo guida ora per essere il campo di ordinamento, ma potrebbe essere un po 'dirompente. – pfctdayelise
Ma come stai usando il namedtuple?La cosa bella di namedtuple è che ti permette di accedere agli elementi per nome, in modo da poter cambiare il tuo namedtuple per avere i campi nel giusto ordine e non influenzare il tuo codice, a patto che tu acceda ai campi per nome (che presumibilmente sei fare, altrimenti perché usato namedtuple?). – BrenBarn