Uygulaması beklemede olan ancak soyut olması planlanmayan yöntemler için NotImplementedError yükseltmek geleneksel midir?


34

NotImplementedErrorUygulamak istediğim herhangi bir yöntem için bir yükseltme yapmayı seviyorum , ancak henüz yapmadığım buralarda. Zaten kısmi bir uygulamam olabilir, fakat raise NotImplementedError()henüz hazırlanmadığım için hazırlayın. Öte yandan, sözleşmelere bağlı kalmayı da seviyorum, çünkü bu diğer insanların kodumu korumasını kolaylaştıracak ve sözleşmeler iyi bir nedenle var olabilir.

Ancak NotImplementedError için Pythons belgeleri :

Bu istisna, RuntimeError'dan kaynaklanır. Kullanıcı tanımlı temel sınıflarda, soyut metotlar metodu geçersiz kılmak için türetilmiş sınıflar gerektirdiğinde bu istisnayı arttırmalıdır.

Bu, tarif ettiğimden çok daha spesifik, resmi bir kullanım durumudur. NotImplementedErrorAPI'nin bu bölümünün devam eden bir çalışma olduğunu belirtmek için basitçe yükseltmek iyi, geleneksel bir tarz mıdır? Değilse, bunu belirtmenin farklı bir standart yolu var mı?


Ne demek "uygun"?
Robert Harvey,

1
@RobertHarvey Sanırım ortak kullanımdan sonra geleneksel demek istiyorum. Şimdi sorumu tekrar yazdım.
gerrit

1
Öncelikle burada C # kullanıyoruz, ancak bu tür bir istisna atma burada aptalca ve başka bir yerde beklerdim. Erken kırmak ve yüksek sesle kırmak, olası sorunları hızlı bir şekilde belirlemek için iyi bir kılavuzdur (okuma: ucuz).
Telastin

Genel olarak bir sınıf oluşturduğumda, işlevselliği yerine getirene kadar TODO yorumlarını uygulanmamış yöntemlere ekliyorum. Eğer sınıf bundan önce üretime bırakılacak olsaydı, istisnalar atmayı düşünürdüm.

5
Buna değer, bunun için Microsoft Visual Studio'nun IDE'yi "bir arabirim uygulamak" için kullandığınızda varsayılan olarak yaptığı şeydir. Robert Harvey’in dediğine göre, sonuç iyi anlaşılmış.
catfood

Yanıtlar:


34

Python belgelerinin bu istisna için bir kullanım durumu (ve muhtemelen kanonik olanı) sunarken, diğer senaryolarda kullanımını özellikle dışlamadığını belirtmekte fayda vardır.

Henüz bir temel sınıfta bir yöntemi geçersiz kılmadıysanız ("arayüzü" yerine getirmek için) NotImplementedError istisnasını yükseltmenin uygun olacağını düşünüyorum.

Google’la ilgili bir kontrol, insanların bu istisnayı kullanırsanız ne anlama geldiğini anlamalarını önerir . Bildiğim hiçbir yan etkisi veya istenmeyen sonucu yoktur; yöntem çağrılırsa basitçe bir istisna atar ve herkes tarafından iyi anlaşılan bir istisna atar.


Dokümantasyon Python 3 ile ilgili bu kesin kullanımını yansıtır:

Kullanıcı tanımlı temel sınıflarda, soyut metotlar metodu geçersiz kılmak için türetilmiş sınıflara ihtiyaç duyduklarında veya gerçek uygulamanın hala eklenmesi gerektiğini belirtmek için sınıf geliştirilirken bu istisnayı ortaya çıkarmalıdır . [Vurgu eklenmiştir]


+1, ancak bu tür bir kongre için küçük bir belgenin çok yol alabileceğini de eklerdim. Bir wiki'deki tek satırlık bir not gibi, repo benioku veya stil rehberi - bunun gibi bir şeyi - bu istisnayı ne için kullandığınızı açıklar.
Ben Lee,

8

Bunu yapıp yapmamanız, yerel (takım veya şirket) sözleşmelerine bağlı olmanız gerekip gerekmediği anlaşılacaktır. TDD bağlamında daha az mantıklı olduğuna dikkat edin, çünkü TEST, yöntemin uygulanmamasını belirleyen şey olmalıdır.

Kısa versiyon şudur: Siz ve ekibiniz uygun görürseniz kullanın.


5
FWIW, Bir istisna atmak, bir nedenden dolayı bu davranışı zorlamanız gerekirse, testi geçememek için iyi bir yol olmalıdır. (Örneğin, bir metod tanımlaması intellisense saplamasının bir parçası olarak faydalı olacaktır.)
DougM

1

Aşağıdaki gibi NotImplementedErrorPython özellik gelişmeleri için genellikle yetiştiriliyor gibi görünüyor :

@classmethod
def fromkeys(cls, iterable, v=None):
    # There is no equivalent method for counters because setting v=1
    # means that no element can have a count greater than one.
    raise NotImplementedError(
        'Counter.fromkeys() is undefined.  Use Counter(iterable) instead.')

dökümantasyon

fromkeys (iterable)

Bu sınıf yöntemi, Counter nesneleri için uygulanmadı.

Kaynak

Collections.Counter.fromkeys

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.