__cmp__ yerine __lt__

| | | | | | |

Python 2.x, karşılaştırma operatörlerini aşırı yüklemenin iki yoluna sahiptir, __cmp__ veya __lt__. Zengin karşılaştırma aşırı yüklemelerinin tercih edildiği söyleniyor, ancak bu neden böyle?

Zengin karşılaştırma operatörlerinin her birini uygulamak daha kolaydır, ancak bunlardan birkaçını neredeyse aynı mantıkla uygulamanız gerekir. . Ancak, yerleşik cmp ve grup sıralamasını kullanabiliyorsanız, o zaman __cmp__ oldukça basitleşir ve tüm karşılaştırmaları yerine getirir:

class A (nesne): def __init__(self, name, age, other): self.name = name self.age = age self.other = other def __cmp__(self, other): assert isinstance(other, A) # bunun için varsayım örnek return cmp((self.name, self.age, self.other), (other.name, other.age, other.other)) 

Bu basitlik benim ihtiyaçlarımı karşılıyor gibi görünüyor tüm 6(!) zengin karşılaştırmayı aşırı yüklemekten çok daha iyi. (Ancak, "değiştirilmiş argüman"/yansıtılmış davranışa güveniyorsanız, bunu "sadece" 4'e düşürebilirsiniz, ancak bu, benim naçizane görüşüme göre net bir komplikasyon artışına neden olur.)

< Strong>Yalnızca __cmp__'u aşırı yüklersem dikkat etmem gereken öngörülemeyen tuzaklar var mı?

<'u anlıyorum , <=, == vb. operatörler başka amaçlar için aşırı yüklenebilir ve istedikleri herhangi bir nesneyi döndürebilir. Bu yaklaşımın yararları hakkında değil, yalnızca bu operatörleri sayılar için ifade ettikleri anlamda karşılaştırmalar için kullanma farklılıkları hakkında soruyorum.

Güncelleme: Christopher belirtildi, cmp kayboluyor 3.x'te Karşılaştırmaların uygulanmasını yukarıdaki __cmp__ kadar kolaylaştıran alternatifler var mı?