Soru Sıralanacak bir sınıf için sadece __lt__ uygulamak güvenli midir?


Sınıf A'nın örneklerinin bir veri yapısında yer alacağını ve sıralanmış olduğunu () bunun üzerine çağrılacağını varsayalım. Sıralı () olarak adlandırılan başka bir kişinin kodudur, bu yüzden bir sıralama işlevi belirtemem ancak ClassA'da hangi yöntemlerin uygun olduğunu uygulayabiliyorum.

Bana öyle geliyor ki

def __lt__(self, other):

yeterlidir ve diğer beş ya da daha fazla metodu uygulamaya ihtiyacım yoktur (qt, eq, le, ge, ne).

Bu yeterli mi?


21
2018-01-10 00:00


Menşei




Cevaplar:


PEP 8 Bu uygulamaya karşı önerir. Buna karşı da tavsiye ederim çünkü hassas bir programlama stili (küçük kod değişikliklerine karşı güçlü değil):

Bunun yerine, functools.total_ordering iş yapmak için sınıf dekoratör:

@total_ordering
class Student:
    def __eq__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))
    def __lt__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))

29
2018-01-10 00:02



Teşekkürler, bu harika! - Matthew Lund
Python'un sıralaması olduğu sadece kullanıldığı şekilde belgelenmiş __lt__()Sadece kayıt için, ama geleceğe hazır olmak iyidir. Bunu bilmiyordum! - kindall
@kindall Bunu sıralama kılavuzumdan mı aldın? Lütfen bir bağlantı sağlayın. Böylece, dokümanların, __lt__'ye güvenilmesinin daha açık olamayacağını net olarak düzenleyebilirim. - Raymond Hettinger
__Lt__'nin yalnızca küçük kod değişiklikleriyle nasıl kırılacağını gösteren bir örnek verebilir misiniz? - Tony
@Tony Evet, yapabilirim. Heapq modülü __le__ 'den __lt__' ye geçtiğinde, tam olarak bu hatayı yapan Twisted'i kırdı (uygulama detayına dayanarak ve önerilen en iyi uygulamayı göz ardı ederek). Sonuç olarak, Python 2.7'ye, tüm kullanıcılar için on adetlik bir faktörle yığın sayısını gösteren adaptör kodunu eklememiz gerekiyordu. Başka bir deyişle, evet bu, gerçek dünyadaki sonuçlarla kötü bir uygulamadır. Önerilen en iyi uygulama bir sebepten dolayı var. Ve functools.total_ordering dekoratör, sadece tek bir kod satırıyla en iyi uygulamaya uymayı kolaylaştırır. - Raymond Hettinger