Berikut adalah empat pemanggilan sederhana dari assert:
>>> assert 1==2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
>>> assert 1==2, "hi"
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError: hi
>>> assert(1==2)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
>>> assert(1==2, "hi")
Perhatikan bahwa yang terakhir tidak menimbulkan kesalahan. Apa perbedaan antara panggilan assert dengan atau tanpa tanda kurung yang menyebabkan perilaku ini? Praktik saya adalah menggunakan tanda kurung, tetapi penjelasan di atas menyarankan agar saya tidak melakukannya.
python
assert
parentheses
gaefan
sumber
sumber
Jawaban:
Yang terakhir
assert
akan memberi Anda peringatan (SyntaxWarning: assertion is always true, perhaps remove parentheses?
) jika Anda menjalankannya melalui interpreter lengkap, bukan melalui IDLE. Karenaassert
merupakan kata kunci dan bukan fungsi, Anda sebenarnya mengirimkan tupel sebagai argumen pertama dan meninggalkan argumen kedua.Ingatlah bahwa tupel yang tidak kosong mengevaluasi ke
True
, dan karena pesan pernyataan bersifat opsional, pada dasarnya Anda telah meneleponassert True
saat menulisassert(1==2, "hi")
.sumber
assert (1==2)
adalah tanda kurung di sekitar ekspresi tunggal tidak akan membuat tupel secara otomatis; Anda akan mendapatkan perilaku yang sama seperti # 4 jika Anda melakukannyaassert (1==2,)
. Hal yang sama akan terjadi jika Anda melakukannya,print ('foo', 'bar')
bukanprint 'foo', 'bar'
; Anda akan melihat tupel dikeluarkanassert(test, message)
mungkin salah, dan tentu saja membingungkan. Tidak ada orang tua!Jika Anda meletakkan tanda kurung di sana karena Anda menginginkan pernyataan multi-baris, maka alternatifnya adalah meletakkan garis miring terbalik di akhir baris seperti ini:
Cetakan:
Mengapa python
assert
ini harus berbeda dari yang lainnya:Saya pikir ideologi pythonic adalah bahwa program harus mengoreksi diri sendiri tanpa harus khawatir tentang bendera khusus untuk mengaktifkan pernyataan. Godaan untuk menonaktifkan asserts terlalu besar, dan karenanya sudah tidak digunakan lagi.
Saya berbagi kekesalan Anda bahwa python
assert
memiliki sintaks unik relatif terhadap semua konstruksi pemrograman python lainnya, dan sintaks ini sekali lagi telah berubah dari python2 menjadi python3 dan sekali lagi berubah dari python 3.4 menjadi 3.6. Membuat pernyataan assert tidak kompatibel ke belakang dari versi mana pun ke versi lain.Ini adalah ketukan di pundak yang
assert
merupakan warga kelas 3, itu akan dihapus sepenuhnya di python4, dan tentunya lagi di Python 8.1.sumber
assert 1==2, "hi"
diuraikanassert 1==2, "hi"
dengan "hi" sebagai parameter kedua untuk kata kunci. Karenanya mengapa itu benar memberikan kesalahan.assert(1==2)
diuraikan sepertiassert (1==2)
yang identik denganassert 1==2
, karena parens di sekitar item tunggal tidak membuat tupel kecuali ada tanda koma, mis(1==2,)
.assert(1==2, "hi")
diuraikan sebagaiassert (1==2, "hi")
, yang tidak memberikan kesalahan karena tupel(False, "hi")
yang tidak kosong bukanlah nilai yang salah, dan tidak ada parameter kedua yang diberikan ke kata kunci.Anda tidak boleh menggunakan tanda kurung karena
assert
bukan fungsi dalam Python - ini adalah kata kunci.sumber
Anda dapat merusak pernyataan assert tanpa
\
seperti ini:Atau jika Anda memiliki pesan yang lebih panjang:
sumber
Berikut ini dikutip dari doc python
Bentuk sederhana, ekspresi assert, setara dengan
if __debug__: if not expression: raise AssertionError
Bentuk yang diperluas, menegaskan ekspresi1, ekspresi2 , setara dengan
if __debug__: if not expression1: raise AssertionError(expression2)
Jadi, saat Anda menggunakan tanda kurung di sini, Anda menggunakan formulir sederhana, dan ekspresi dievaluasi sebagai tupel, yang selalu True saat dicor ke bool
sumber