2013-02-27 13 views
5

Ben str genişletmek ve sihirli yöntem __cmp__ geçersiz çalışıyorum.Eğer sihirli bir yöntem geçersiz kılabilir miyim?

class MyStr(str): 
    def __cmp__(self, other): 
     print '(was called)', 
     return int(self).__cmp__(int(other)) 


print 'Testing that MyStr(16) > MyStr(7)' 
print '---------------------------------' 
print 'using _cmp__ :', MyStr(16).__cmp__(MyStr(7)) 
print 'using > :', MyStr(16) > MyStr(7) 

sonuçları çalıştırdığınızda: Aşağıdaki örnek > kullanıldığında sihirli yöntem __cmp__ asla denir göstermektedir > kullanırken Açıkçası

Testing that MyStr(16) > MyStr(7) 
--------------------------------- 
using __cmp__ : (was called) 1 
using > : False 

, içinde işlevsellik "karşılaştırma" altında yatan builtin çağrılıyor, bu durumda bir alfabe düzenleniyor.

sihirli yöntemlerle __cmp__ yerleşiğini geçersiz kılmak için bir yolu var mı? Ve eğer doğrudan yapamazsanız - burada neler yapabileceğiniz sihirli olmayan yöntemlerden farklıdır? the corresponding magic method veya muadili tanımlanır ve NotImplemented dönmemesi halinde

cevap

4

Karşılaştırma operatörleri do not call __cmp__:

 

PS

class MyStr(str): 
    def __gt__(self, other): 
     print '(was called)', 
     return int(self) > int(other) 


print MyStr(16) > MyStr(7) # True 
:

class MyStr(str): 
    def __gt__(self, other): 
     try: 
      return int(self) > int(other) 
     except ValueError: 
      return False 
: Muhtemelen istisnalar atmak için zararsız karşılaştırmalar istemiyoruz
+0

Teşekkürler! Bu küçük gerçeği hiç bilmiyordum. Mantıklı. Yanıt hızı için +1! BTW - Çok hızlıydı - hala cevabı kabul etmeme izin vermek için stackoverflow'u bekliyorum (henüz 2 dakika beklemem gerekiyor). Hızlı ve değerli bir cevap için nasıl? Henüz :) – Rocketman

+0

Ahh o değerli ilan edilemez böylece hızlı oldu - İşte ... şimdi kabul go! – Rocketman

+2

'__() 'çağrı http://ideone.com/ ([' NotImplemented' dönmek için '') __lt __() ve '__gt __ (' str' yöntemlerine] geçersiz kılma'> 'operatör için zorlanabilir __cmp rC5D8v) yani "eğer başka bir sihir karşılaştırma yöntemi tanımlanmışsa" cevabınız kesin değildir. Tutarlılık için tüm veya yöntemlerden hiçbiri tanımlanmalıdır: '__lt __() ',' __gt __() ',' __le __() ',' __ge __() ',' __eq __() ',' __ne __() ', ayrıca __hash __() '. – jfs

İlgili konular