Es scheint, als könnten Sie eine list
anstelle einer tuple
. Dies wird meines Erachtens wichtiger, wenn Sie Attribute anstelle von "magischen Indizes" einer Liste/eines Tupels abrufen.
In meinem Fall wollte ich nach mehreren Attributen einer Klasse sortieren, wobei die eingehenden Schlüssel Zeichenketten waren. Ich brauchte verschiedene Sortierungen an verschiedenen Stellen und wollte eine gemeinsame Standardsortierung für die übergeordnete Klasse, mit der die Clients interagieren. Ich musste die "Sortierschlüssel" nur überschreiben, wenn ich es wirklich "brauchte", aber auch so, dass ich sie als Listen speichern konnte, die die Klasse gemeinsam nutzen konnte
Also habe ich zunächst eine Hilfsmethode definiert
def attr_sort(self, attrs=['someAttributeString']:
'''helper to sort by the attributes named by strings of attrs in order'''
return lambda k: [ getattr(k, attr) for attr in attrs ]
dann zu verwenden
# would defined elsewhere but showing here for consiseness
self.SortListA = ['attrA', 'attrB']
self.SortListB = ['attrC', 'attrA']
records = .... #list of my objects to sort
records.sort(key=self.attr_sort(attrs=self.SortListA))
# perhaps later nearby or in another function
more_records = .... #another list
more_records.sort(key=self.attr_sort(attrs=self.SortListB))
Dabei wird die generierte Lambda-Funktion verwendet, um die Liste nach object.attrA
und dann object.attrB
unter der Annahme, dass object
hat einen Getter, der den angegebenen Stringnamen entspricht. Und der zweite Fall würde sortieren nach object.attrC
puis object.attrA
.
Dies ermöglicht es Ihnen auch, potenziell nach außen Sortierung Entscheidungen zu teilen gleich von einem Verbraucher, ein Unit-Test, oder für sie vielleicht sagen, wie sie wollen, dass die Sortierung für einige Betrieb in Ihrem api durch nur haben, um Ihnen eine Liste und nicht Kopplung sie zu Ihrem Back-End-Implementierung getan.