Utilizo mucho las clases namedtuple. He estado pensando hoy si hay una buena manera de implementar la clasificación personalizada para dicha clase, es decir, hacer que la clave de clasificación predeterminada no sea el primer elemento (luego el segundo, el tercero, etc.) de namedtuple.Clasificación personalizada en una clase namedtuple
Mi primer instinto fue implementar __lt__
y __eq__
y dejar total_ordering
haga el resto (que se llena a cabo 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
Sin embargo:
def test_sortingB():
b1 = B(1, 2)
b2 = B(2, 1)
assert b2 < b1 # passes
assert b2 <= b1 # fails
oh, right ... total_ordering
solo llena los otros métodos if they are missing. Como tuple/namedtuple tiene tales métodos, total_ordering no está haciendo nada por mí.
así que supongo que mis opciones son
- parada usando namedtuple y simplemente construir mi propia clase aburrida, siga usando total_ordering
- seguir usando namedtuple e implementar los 6 métodos de comparación
- seguir usando namedtuple y el inserto un valor de clasificación como el primer campo. Afortunadamente no tengo muchas instancias de la clase, pero generalmente solo confío en el orden de los campos para inicializarlos, lo que podría ser desagradable. Tal vez ese es un mal hábito.
Sugerencias sobre la mejor manera de solucionar esto?
¿Por qué no acaba de crear la tabla de selección con los campos en el orden que desea ordenar? – BrenBarn
No me di cuenta de que me gustaría ordenar/maximizar, etc. hasta que ya lo había creado y lo usé por un tiempo. Así que podría agregar un campo principal ahora para ser el campo de clasificación, pero podría ser un poco perturbador. – pfctdayelise
Pero, ¿cómo estás usando el namedtuple?Lo bueno de namedtuple es que le permite acceder a los elementos por su nombre, por lo que puede cambiar su tilde nombrada para tener los campos en el orden correcto y no afectar su código, siempre y cuando tenga acceso a los campos por su nombre (que presumiblemente es haciendo, o bien, ¿por qué usar namedtuple?). – BrenBarn