Baiklah, ini adalah pertanyaan terbuka, dan saya memiliki dua aspek yang ingin saya sentuh: kapan menambahkan pernyataan dan bagaimana menulis pesan kesalahan.
Tujuan
Untuk menjelaskannya kepada pemula - pernyataan adalah pernyataan yang dapat menimbulkan kesalahan, tetapi Anda tidak akan menangkapnya. Dan mereka biasanya tidak harus dibangkitkan, tetapi dalam kehidupan nyata terkadang mereka memang dibesarkan. Dan ini adalah situasi serius, di mana kode tidak dapat dipulihkan dari, apa yang kita sebut 'kesalahan fatal'.
Selanjutnya, ini untuk 'tujuan debugging', yang, meskipun benar, terdengar sangat meremehkan. Saya suka formulasi 'menyatakan invarian, yang tidak boleh dilanggar' lebih baik, meskipun bekerja secara berbeda pada pemula yang berbeda ... Beberapa 'hanya mengerti', dan yang lain tidak menemukan gunanya, atau mengganti pengecualian normal, atau bahkan mengendalikan aliran dengannya.
Gaya
Dalam Python, assert
adalah pernyataan, bukan fungsi! (ingat assert(False, 'is true')
tidak akan naik. Tapi, memiliki itu keluar dari jalan:
Kapan, dan bagaimana, menulis 'pesan kesalahan' opsional?
Ini berlaku untuk kerangka pengujian unit, yang sering memiliki banyak metode khusus untuk melakukan asersi ( assertTrue(condition)
, assertFalse(condition), assertEqual(actual, expected)
dll.). Mereka sering juga menyediakan cara untuk mengomentari pernyataan tersebut.
Dalam kode dibuang Anda bisa melakukannya tanpa pesan kesalahan.
Dalam beberapa kasus, tidak ada yang ditambahkan ke pernyataan:
def dump (sesuatu): nyatakan isinstance (sesuatu, Dumpable) # ...
Namun terlepas dari itu, pesan berguna untuk komunikasi dengan programmer lain (yang kadang-kadang pengguna interaktif kode Anda, misalnya dalam Ipython / Jupyter dll.).
Beri mereka informasi, bukan hanya membocorkan detail implementasi internal.
dari pada:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
menulis:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
atau bahkan mungkin:
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
Saya tahu, saya tahu - ini bukan kasus untuk pernyataan statis, tetapi saya ingin menunjukkan nilai informasi dari pesan tersebut.
Pesan negatif atau positif?
Ini mungkin kontroversial, tetapi saya sakit membaca hal-hal seperti:
assert a == b, 'a is not equal to b'
ini adalah dua hal yang saling bertentangan yang ditulis di sebelah satu sama lain. Jadi setiap kali saya memiliki pengaruh pada basis kode, saya mendorong untuk menentukan apa yang kita inginkan, dengan menggunakan kata kerja tambahan seperti 'harus' dan 'harus', dan tidak mengatakan apa yang tidak kita inginkan.
menyatakan a == b, 'a harus sama dengan b'
Kemudian, mendapatkan AssertionError: a must be equal to b
juga dapat dibaca, dan pernyataan itu terlihat logis dalam kode. Juga, Anda bisa mendapatkan sesuatu darinya tanpa membaca traceback (yang kadang-kadang bahkan tidak tersedia).