Aşağıdaki kod var:Operatör aşırı yüklerken python türleri mi değişir?
a = str('5')
b = int(5)
a == b
# False
Ama int
bir alt sınıfı yaparsanız ve __cmp__
reimplement:
class A(int):
def __cmp__(self, other):
return super(A, self).__cmp__(other)
a = str('5')
b = A(5)
a == b
# TypeError: A.__cmp__(x,y) requires y to be a 'A', not a 'str'
Neden bu iki farklı? Python çalışma zamanı,
int.__cmp__()
tarafından atılan TypeError'ı yakalayıp bunu
False
değeri olarak yorumluyor mu? Birisi bana bunun nasıl çalıştığını gösteren 2.x cpython kaynağında biraz işaret edebilir mi? Işleve
wrap_cmpfunc
yılında
typeobject.c
bu sonuca nedenini bulabilirsiniz CPython kaynağını 2.x için İlişkin
Güncelleme
>>> class A(int):
... def __cmp__(self, other):
... return super(A, self).__cmp__(A(other)) # <--- A(other) instead of other
...
>>> a = str('5')
>>> b = A(5)
>>> a == b
True
: Ben senin sorunun hakkını anlasalardı
Bir yan notta: '__cmp__''nin yaşlardan önce kullanımdan kaldırıldığını biliyor musunuz? Zengin karşılaştırma işlevlerini uygulamanız gerekir. – Bakuriu
Evet, bu, bir istisna yükseltmek mi, yoksa __eq__ uygulamasında NotImplemented mi döndüreceğimi anlamaya çalışırken ortaya çıktı. Yerleşik Python sınıflarının neler yaptığını görmek istedim ve tutarsız görünen bu örneği buldum. – Chris