Apakah konvensional untuk meningkatkan NotImplementedError untuk metode yang implementasinya tertunda, tetapi tidak direncanakan abstrak?

34

Saya suka menaikkan NotImplementedErroruntuk metode apa pun yang ingin saya terapkan, tetapi di mana saya belum sempat melakukannya. Saya mungkin sudah memiliki implementasi parsial, tetapi tambahkan dengan raise NotImplementedError()karena saya belum menyukainya. Di sisi lain, saya juga suka tetap berpegang pada konvensi, karena ini akan memudahkan orang lain untuk menjaga kode saya, dan konvensi mungkin ada karena alasan yang baik.

Namun dokumentasi Python untuk status NotImplementedError :

Pengecualian ini berasal dari RuntimeError. Di kelas dasar yang ditentukan pengguna, metode abstrak harus meningkatkan pengecualian ini ketika mereka membutuhkan kelas turunan untuk mengganti metode.

Itu adalah kasus penggunaan formal yang jauh lebih spesifik daripada yang saya jelaskan. Apakah ini gaya yang baik dan konvensional untuk menaikkan NotImplementedErrorhanya untuk menunjukkan bahwa bagian API ini sedang dalam proses? Jika tidak, apakah ada cara standar yang berbeda untuk menunjukkan hal ini?

gerrit
sumber
Apa yang Anda maksud dengan "pantas?"
Robert Harvey
1
@ RobertTarvey Saya kira saya maksudkan konvensional, mengikuti penggunaan umum. Saya telah mengulangi pertanyaan saya sekarang.
gerrit
1
Kami menggunakan C # di sini terutama, tapi melempar pengecualian semacam itu idiomatis di sini, dan saya harapkan di tempat lain. Istirahat awal dan istirahat dengan keras adalah pedoman yang baik untuk mengidentifikasi masalah potensial dengan cepat (baca: tidak mahal).
Telastyn
Secara umum jika saya membuat kelas, saya hanya menaruh komentar TODO dalam metode yang tidak diterapkan sampai saya bisa menerapkan fungsi. Jika kelas akan dirilis ke produksi sebelum itu terjadi, saya akan mempertimbangkan untuk melempar pengecualian.
5
Untuk apa nilainya, inilah yang dilakukan Microsoft Visual Studio secara default saat Anda menggunakan IDE untuk "mengimplementasikan antarmuka." Menurut Robert Harvey, hasilnya dipahami dengan baik.
catfood

Jawaban:

34

Perlu dicatat bahwa, sementara dokumentasi Python menyediakan kasus penggunaan (dan mungkin yang kanonik) untuk pengecualian ini, itu tidak secara khusus mengecualikan penggunaannya dalam skenario lain.

Saya akan menganggap pantas untuk meningkatkan pengecualian NotImplementedError jika Anda belum menimpa metode di kelas dasar (untuk memenuhi "antarmuka").

Pemeriksaan sepintas di Google menunjukkan bahwa orang akan memahami apa yang Anda maksud jika Anda menggunakan pengecualian dengan cara ini. Tidak ada efek samping atau konsekuensi yang tidak diinginkan yang saya ketahui; metode ini hanya akan melempar eksepsi jika dipanggil, dan itu akan melempar eksepsi yang dipahami oleh semua orang.


The dokumentasi untuk Python 3 mencerminkan penggunaan ini tepat:

Di kelas dasar yang ditentukan pengguna, metode abstrak harus meningkatkan pengecualian ini ketika mereka membutuhkan kelas turunan untuk mengganti metode, atau saat kelas sedang dikembangkan untuk menunjukkan bahwa implementasi nyata masih perlu ditambahkan . [Penekanan ditambahkan]

Robert Harvey
sumber
+1, tapi saya juga menambahkan bahwa untuk konvensi semacam ini, sedikit dokumentasi bisa bermanfaat. Seperti catatan satu baris dalam wiki dev, repo readme, atau pedoman gaya - sesuatu seperti itu - menjelaskan untuk apa Anda menggunakan pengecualian ini.
Ben Lee
8

Ini akan dipahami, apakah Anda melakukannya atau tidak, harus bergantung pada konvensi lokal (tim atau perusahaan). Perhatikan bahwa itu kurang masuk akal dalam konteks TDD karena UJI harus menjadi apa yang menentukan bahwa metode ini tidak diterapkan.

Versi singkatnya adalah: digunakan jika Anda dan tim Anda menganggapnya pantas.

jmoreno
sumber
5
FWIW, Melempar pengecualian harus menjadi cara yang baik untuk mendapatkan tes gagal, jika karena alasan tertentu Anda perlu memaksakan perilaku itu. (Ini akan berguna sebagai bagian dari rintisan intellisense metode-definisi, misalnya.)
DougM
1

Tampaknya hal NotImplementedErroritu biasanya dimunculkan untuk pengembangan fitur Python sendiri, seperti berikut:

@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.')

Dokumentasi

fromkeys (iterable)

Metode kelas ini tidak diterapkan untuk objek Counter.

Sumber

Collections.Counter.fromkeys

Emma
sumber