NotImplementedError öğesini yükseltmek yerine NotImplemented öğesini neden iade etmelisiniz?


282

Python adlı bir singleton var NotImplemented .

Birisi istisnayı NotImplementedyükseltmek yerine neden geri dönmek isteyesin ki NotImplementedError? Geçersiz yöntemleri yürüten kod gibi hataları bulmayı zorlaştırmayacak mı?

Yanıtlar:


280

Çünkü __lt__()ve ilgili karşılaştırma yöntemleri liste türlerinde dolaylı olarak yaygın olarak kullanılmaktadır. Bazen algoritma başka bir yol denemeyi veya varsayılan bir kazanan seçmeyi seçer. Bir istisna oluşturmak, yakalanmadığı sürece bu türden çıkar.NotImplemented yükseltilmez ve daha sonraki testlerde kullanılabilir.

http://jcalderone.livejournal.com/32837.html

Bu bağlantıyı özetlemek için:

" NotImplementedçalışma zamanına bir başkasının işlemi yerine getirmesini istemesi gerektiğini bildirir. İfadede a == b, eğer a.__eq__(b)döndürürse NotImplemented, Python dener b.__eq__(a). Geri bdönmek için yeterli bilgi varsa Trueveya Falseifade başarılı olabilir. Değilse, çalışma zamanı geri düşmek yerleşik (için kimlik dayanmaktadır davranış ==ve !=)."


5
Bu bağlantı belgenin sonuna yaklaştığından, bunu kullanırken dikkatli olurum.
Jason Coon

16
Python yorumlayıcısı a.__eq__(b)döndürülen NotImplemented öğesinin olup olmadığını kontrol ettiğinde, NotImplementedError yerine kolayca yakalanamadı (ve çağırın b.__eq__(a)ya da her neyse)?
Veky

24
@Veky. Bir istisna oluşturmak muhtemelen daha yüksek bir yüke sahiptir. Bir sıralama işlemindeki herhangi bir ek yük, listenin boyutuna göre büyütülür, bu nedenle fark çok küçük olsa bile, daha hızlı bir uygulama bulmak yine de mantıklı olacaktır. Ayrıca döngülerinizden kopmak ve bir try / catch uygulamasının gerektireceği yeniden girmek istemezsiniz.
SpliFF

3
İlk nokta için her zaman NotImplemented döndürecek bir şeyi çağırmak yerine lt'yi tersine gt olarak otomatik olarak sentezlemek daha hızlı bir çözüm olacaktır ve Python bunu yapmaz. Burada hızın hız olduğunu düşünmüyorum. İkincisi, ne dediğini anlamıyorum: dönüş, yükseliş kadar döngülerden kopmayı gerektirecektir. Aslında, dönüşü her zaman çağıran kapsamda yakalanan özel bir Geri Dönüş istisnası olarak hayal edebilirsiniz.
Veky

2
>> "listenin büyüklüğüne göre büyütülmüş" En azından, dünya hakkında bilmeniz gereken bir O (n) türünüz yoksa.
Jonathan Hartley

107

Çünkü farklı kullanım durumları var.

Dokümanlardan alıntı yapma (Python 3.6):

Uygulanmadı

(örneğin ikili özel yöntemlerle iade edilmelidir __eq__(), __lt__(), __add__(), __rsub__(), vb) işlemi diğer tipe göre uygulanmadı belirtmek için

istisna NotImplementedError

[...] Kullanıcı tanımlı temel sınıflarda, soyut yöntemler, yöntemi geçersiz kılmak için türetilmiş sınıflar gerektirdiğinde veya sınıf gerçek uygulamanın hala eklenmesi gerektiğini belirtmek için geliştirilirken bu istisnayı artırmalıdır.

Ayrıntılar için bağlantılara bakın.


Bu kabul edilen cevap olmalı. Kullanım durumlarından bile daha güçlüdür, niyetin bir göstergesidir - adın sonunda Hata olanı bir Hata oluştuğunu (bir şey uygulanmadığından), diğeri bir hata değil, "uygun" davranışı. NaN döndürme veya ValueError yükseltme arasındaki farka benziyor.
Korone

13

Bunun bir nedeni performanstır. Kısa sürede çok sayıda işlem yapabileceğiniz zengin karşılaştırmalar gibi bir durumda, çok sayıda istisna oluşturmak ve işlemek, bir NotImplementeddeğer döndürmekten çok daha uzun sürebilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.