Saya telah membaca beberapa kode sumber dan di beberapa tempat saya telah melihat penggunaan assert
.
Apa artinya sebenarnya? Apa penggunaannya?
python
assert
assertions
Hossein
sumber
sumber
Jawaban:
The
assert
pernyataan ada di hampir setiap bahasa pemrograman. Ini membantu mendeteksi masalah di awal program Anda, di mana penyebabnya jelas, daripada kemudian sebagai efek samping dari beberapa operasi lain.Saat kamu melakukan...
... Anda memberi tahu program untuk menguji kondisi itu, dan segera memicu kesalahan jika kondisinya salah.
Dalam Python, kira-kira sama dengan ini:
Cobalah di shell Python:
Pernyataan dapat menyertakan pesan opsional, dan Anda dapat menonaktifkannya saat menjalankan juru bahasa.
Untuk mencetak pesan jika pernyataan gagal:
Jangan tidak menggunakan kurung untuk memanggil
assert
seperti fungsi. Itu adalah pernyataan. Jika Anda melakukannya,assert(condition, message)
Anda akan menjalankanassert
dengan(condition, message)
tuple sebagai parameter pertama.Seperti untuk menonaktifkan mereka, saat menjalankan
python
dalam mode dioptimalkan, di mana__debug__
adalahFalse
, pernyataan menegaskan akan diabaikan. Lewati saja-O
bendera:Lihat di sini untuk dokumentasi yang relevan.
sumber
if not condition: raise AssertError()
, mengapa saya harus menggunakan penegasan? Apakah ada kondisi di mana penegasan lebih baik daripada hanya menjadi bentukif not condition
pernyataan yang lebih pendek ?if
). Baca dokumen untuk info lebih lanjut :)assert
, tetapi setelah membaca semua jawaban, saya benar-benar tidak mendapatkan apa pun yang saya inginkan!Hati-hati dengan tanda kurung. Seperti yang telah ditunjukkan di atas, dalam Python 3,
assert
masih merupakan pernyataan , jadi dengan analogi denganprint(..)
, seseorang dapat memperkirakan hal yang sama denganassert(..)
atauraise(..)
tetapi Anda tidak seharusnya.Ini penting karena:
tidak akan bekerja, tidak seperti
Alasan yang pertama tidak akan berfungsi adalah karena
bool( (False, "Houston we've got a problem") )
dievaluasiTrue
.Dalam pernyataan itu
assert(False)
, ini hanya tanda kurung yang berlebihanFalse
, yang mengevaluasi isinya. Tetapi denganassert(False,)
tanda kurung sekarang menjadi tuple, dan tuple non-kosong dievaluasiTrue
dalam konteks boolean.sumber
assert (2 + 2 = 5), "Houston we've got a problem"
harusnya ok, ya?assert (2 + 2 = 5), "Houston we've got a problem"
tidak akan bekerja ... tapi itu tidak ada hubungannya dengan pernyataan tegas, yang baik-baik saja. Kondisi Anda tidak akan berfungsi karena itu bukan suatu kondisi. Hilang sebentar=
.Seperti yang dicatat oleh jawaban lain,
assert
mirip dengan melempar pengecualian jika kondisi yang diberikan tidak benar. Perbedaan penting adalah pernyataan tegas diabaikan jika Anda mengkompilasi kode Anda dengan opsi optimisasi-O
. The dokumentasi mengatakan bahwaassert expression
lebih baik dapat digambarkan sebagai setara denganIni dapat berguna jika Anda ingin menguji kode Anda secara menyeluruh, kemudian merilis versi yang dioptimalkan ketika Anda senang bahwa tidak ada kasus pernyataan Anda gagal - ketika optimasi aktif,
__debug__
variabel menjadi False dan kondisi akan berhenti dievaluasi. Fitur ini juga dapat menangkap Anda jika Anda mengandalkan konfirmasi dan tidak menyadari bahwa mereka telah menghilang.sumber
if Not Error: raise Exception(“ this is a error”)
? Dengan begitu, program masih akan menunjukkan sumber kesalahan, ketika pengguna menjalankannya ..assert
pernyataan itu? Asumsinya di sini adalah bahwa ketika program dirilis ke pengguna akhir, Anda menggunakan flag -O, dengan demikian dengan asumsi bahwa semua bug telah dihapus. Karenanya, setiap kesalahan atau crash program disebabkan oleh input ke program yang valid sesuai kontrak, tetapi tidak dapat ditangani oleh program. Jadi harus memperingatkan pengguna seperti itu.Tujuan pernyataan Python adalah untuk memberi tahu pengembang tentang kesalahan yang tidak dapat dipulihkan dalam suatu program.
Pernyataan tidak dimaksudkan untuk memberi sinyal kondisi kesalahan yang diharapkan, seperti "file tidak ditemukan", di mana pengguna dapat mengambil tindakan korektif (atau coba lagi).
Cara lain untuk melihatnya adalah dengan mengatakan bahwa asersi adalah pemeriksaan diri internal dalam kode Anda. Mereka bekerja dengan menyatakan beberapa kondisi sebagai tidak mungkin dalam kode Anda. Jika kondisi ini tidak berlaku itu berarti ada bug dalam program.
Jika program Anda bebas bug, kondisi ini tidak akan pernah terjadi. Tetapi jika salah satu dari mereka benar- benar muncul, program akan macet dengan kesalahan pernyataan yang memberitahu Anda dengan tepat kondisi "mustahil" apa yang dipicu. Ini membuatnya lebih mudah untuk melacak dan memperbaiki bug di program Anda.
Berikut ringkasan dari tutorial tentang pernyataan Python yang saya tulis:
sumber
assert
pernyataan dan kapan menggunakannya. Saya mencoba memahami sejumlah istilah yang Anda perkenalkan dalam artikel.assert store.product_exists(product_id), 'Unknown product id'
ini bukan praktik yang baik, karena jika debug dimatikan makauser
bahkan jika tidakadmin
akan dapat menghapus produk. Apakah Anda menganggapnyaassert user.is_admin()
sebagaiunrecoverable
kesalahan? Mengapa ini bukanself-check
?assert statement
, bukankahprice
juga dapat dianggap sebagai input pengguna? Mengapa Anda mempertimbangkanassert user.is_admin()
validasi data tetapi tidakassert price
?Orang lain telah memberi Anda tautan ke dokumentasi.
Anda dapat mencoba yang berikut ini dalam shell interaktif:
Pernyataan pertama tidak melakukan apa pun, sedangkan pernyataan kedua menimbulkan pengecualian. Ini adalah petunjuk pertama: menegaskan berguna untuk memeriksa kondisi yang seharusnya benar dalam posisi kode Anda (biasanya, awal (prasyarat) dan akhir fungsi (postkondisi)).
Pernyataan sebenarnya sangat terkait dengan pemrograman berdasarkan kontrak, yang merupakan praktik rekayasa yang sangat berguna:
http://en.wikipedia.org/wiki/Design_by_contract .
sumber
Dari dokumen:
Di sini Anda dapat membaca lebih lanjut: http://docs.python.org/release/2.5.2/ref/assert.html
sumber
Pernyataan tegas memiliki dua bentuk.
Bentuk sederhana
assert <expression>
,, setara denganFormulir diperpanjang
assert <expression1>, <expression2>
,, setara dengansumber
Pernyataan adalah cara sistematis untuk memeriksa bahwa keadaan internal suatu program adalah seperti yang diharapkan oleh programmer, dengan tujuan menangkap bug. Lihat contoh di bawah ini.
sumber
Ini adalah contoh sederhana, simpan dalam file ini (misalkan b.py)
dan hasilnya kapan
$python b.py
sumber
jika pernyataan setelah pernyataan benar maka program berlanjut, tetapi jika pernyataan setelah pernyataan salah maka program memberikan kesalahan. Sederhana seperti itu.
misalnya:
sumber
The
assert
pernyataan ada di hampir setiap bahasa pemrograman. Ini membantu mendeteksi masalah di awal program Anda, di mana penyebabnya jelas, daripada kemudian sebagai efek samping dari beberapa operasi lain. Mereka selalu mengharapkan suatuTrue
kondisi.Ketika Anda melakukan sesuatu seperti:
Anda memberi tahu program untuk menguji kondisi itu dan segera memicu kesalahan jika salah.
Dalam Python,
assert
ekspresi , setara dengan:Anda dapat menggunakan ekspresi yang diperluas untuk menyampaikan pesan opsional :
Cobalah di juru bahasa Python:
Ada beberapa peringatan untuk dilihat sebelum menggunakannya terutama bagi mereka yang menganggap beralih di antara pernyataan
assert
danif
. Tujuan untuk digunakanassert
adalah pada saat-saat ketika program memverifikasi suatu kondisi dan mengembalikan nilai yang harus menghentikan program segera daripada mengambil beberapa cara alternatif untuk mem-bypass kesalahan:1. Tanda kurung
Seperti yang mungkin Anda perhatikan,
assert
pernyataan itu menggunakan dua kondisi. Oleh karena itu, jangan tidak menggunakan tanda kurung untuk englobe mereka sebagai salah satu nasihat yang jelas. Jika Anda melakukan seperti:Contoh:
Anda akan menjalankan
assert
dengan(condition, message)
yang mewakili tuple sebagai parameter pertama, dan ini terjadi karena tuple tidak kosong di Python selaluTrue
. Namun, Anda dapat melakukan secara terpisah tanpa masalah:Contoh:
2. Tujuan debug
Jika Anda bertanya-tanya tentang kapan menggunakan
assert
pernyataan. Ambil contoh yang digunakan dalam kehidupan nyata:* Ketika program Anda cenderung mengontrol setiap parameter yang dimasukkan oleh pengguna atau apa pun yang lain:
* Kasus lain adalah pada matematika ketika 0 atau non-positif sebagai koefisien atau konstan pada persamaan tertentu:
* atau bahkan contoh sederhana dari implementasi boolean:
3. Pemrosesan data atau validasi data
Yang paling penting adalah untuk tidak bergantung pada
assert
pernyataan untuk menjalankan pemrosesan data atau validasi data karena pernyataan ini dapat dimatikan pada inisialisasi Python dengan-O
atau-OO
flag - artinya nilai 1, 2, dan 0 (sebagai default), masing-masing - atauPYTHONOPTIMIZE
variabel lingkungan .Nilai 1:
* menegaskan dinonaktifkan;
* file bytecode dihasilkan menggunakan
.pyo
ekstensi alih-alih.pyc
;*
sys.flags.optimize
diatur ke 1 (True
);* dan,
__debug__
diatur keFalse
;Nilai 2: menonaktifkan satu hal lagi
* docstring dinonaktifkan;
Oleh karena itu, menggunakan
assert
pernyataan untuk memvalidasi jenis data yang diharapkan sangat berbahaya, menyiratkan bahkan untuk beberapa masalah keamanan. Kemudian, jika Anda perlu memvalidasi beberapa izin saya sarankan Andaraise AuthError
sebagai gantinya. Sebagai prasyarat efektif, suatuassert
umumnya digunakan oleh pemrogram di perpustakaan atau modul yang tidak memiliki pengguna berinteraksi secara langsung.sumber
Seperti yang dirangkum secara ringkas di C2 Wiki :
Anda dapat menggunakan
assert
pernyataan untuk mendokumentasikan pemahaman Anda tentang kode pada titik program tertentu. Misalnya, Anda dapat mendokumentasikan asumsi atau jaminan tentang input (prakondisi), status program (invarian), atau output (postkondisi).Jika pernyataan Anda pernah gagal, ini merupakan peringatan bagi Anda (atau penerus Anda) bahwa pemahaman Anda tentang program itu salah ketika Anda menulisnya, dan itu kemungkinan mengandung bug.
Untuk informasi lebih lanjut, John Regehr memiliki posting blog yang bagus tentang Penggunaan Pernyataan , yang juga berlaku untuk
assert
pernyataan Python .sumber
Jika Anda pernah ingin tahu persis apa fungsi cadangan tidak digunakan dalam python, ketikkan
help(enter_keyword)
Pastikan jika Anda memasukkan kata kunci khusus yang Anda masukkan sebagai string.
sumber
Python assert pada dasarnya adalah bantuan debugging yang menguji kondisi untuk memeriksa sendiri internal kode Anda. Penegasan membuat proses debug sangat mudah ketika kode Anda masuk ke kasus tepi yang mustahil. Tegaskan memeriksa kasus-kasus mustahil.
Katakanlah ada fungsi untuk menghitung harga barang setelah diskon:
di sini, discounted_price tidak boleh kurang dari 0 dan lebih besar dari harga sebenarnya. Jadi, jika kondisi di atas dilanggar, maka akan muncul Kesalahan Pernyataan, yang membantu pengembang untuk mengidentifikasi bahwa sesuatu yang mustahil telah terjadi.
Semoga bermanfaat :)
sumber
assert
berguna dalam konteks debugging, tetapi tidak boleh diandalkan di luar konteks debugging.Penjelasan singkat saya adalah:
assert
memunculkanAssertionError
jika ekspresi salah, jika tidak hanya melanjutkan kode, dan jika ada koma apa pun ituAssertionError: whatever after comma
, dan untuk kode seperti:raise AssertionError(whatever after comma)
Tutorial terkait tentang ini:
sumber
assert
, tetapi tidak kapan menggunakan (atau tidak menggunakan) suatuassert
; juga mencatat bahwaassert
dapat dinonaktifkan jika__debug__
yaituFalse
akan berguna.Di Pycharm, jika Anda menggunakan
assert
bersamaisinstance
untuk mendeklarasikan jenis objek, ia akan memungkinkan Anda mengakses metode dan atribut dari objek induk saat Anda mengode, itu akan secara otomatis dilengkapi.Sebagai contoh, katakanlah
self.object1.object2
adalahMyClass
objek.sumber
Seperti yang ditulis dalam jawaban lain,
assert
pernyataan digunakan untuk memeriksa keadaan program pada titik tertentu.Saya tidak akan mengulangi apa yang dikatakan tentang pesan terkait, tanda kurung, atau
-O
opsi dan__debug__
konstan. Periksa juga dokumen untuk informasi tangan pertama. Saya akan fokus pada pertanyaan Anda: apa gunanyaassert
? Lebih tepatnya, kapan (dan kapan tidak) harus digunakanassert
?The
assert
pernyataan berguna untuk debug program, tetapi berkecil untuk memeriksa input pengguna. Saya menggunakan aturan praktis berikut: menjaga pernyataan untuk mendeteksi situasi yang seharusnya tidak terjadi . Input pengguna mungkin salah, mis. Kata sandi terlalu pendek, tetapi ini bukan hal yang seharusnya tidak terjadi . Jika diameter lingkaran tidak dua kali lebih besar dari jari-jarinya, Anda berada dalam kasus ini seharusnya tidak terjadi .Yang paling menarik, dalam pikiran saya, penggunaan
assert
terinspirasi oleh pemrograman dengan kontrak seperti yang dijelaskan oleh B. Meyer dalam [Konstruksi Perangkat Lunak Berorientasi Objek] ( https://www.eiffel.org/doc/eiffel/Object-Oriented_Software_Construction%) 2C_2nd_Edition ) dan diimplementasikan dalam [Bahasa pemrograman Eiffel] ( https://en.wikipedia.org/wiki/Eiffel_(programming_language) ). Anda tidak dapat sepenuhnya meniru pemrograman dengan kontrak menggunakanassert
pernyataan itu, tetapi menarik untuk mempertahankan maksudnya.Ini sebuah contoh. Bayangkan Anda harus menulis
head
fungsi (seperti [head
fungsi di Haskell] ( http://www.zvon.org/other/haskell/Outputprelude/head_f.html )). Spesifikasi yang Anda berikan adalah: "jika daftar tidak kosong, kembalikan item pertama dari daftar". Lihatlah implementasi berikut:Dan
(Ya, ini bisa ditulis sebagai
return xs[0] if xs else None
, tapi bukan itu intinya) .Jika daftar ini tidak kosong, kedua fungsi memiliki hasil yang sama dan hasil ini benar:
Oleh karena itu, kedua implementasi itu (saya harap) benar. Mereka berbeda ketika Anda mencoba untuk mengambil item kepala dari daftar kosong:
Tapi:
Sekali lagi, kedua implementasi sudah benar, karena tidak ada yang harus memberikan daftar kosong ke fungsi-fungsi ini (kami di luar spesifikasi ). Itu panggilan yang salah, tetapi jika Anda melakukan panggilan seperti itu, apa pun bisa terjadi. Satu fungsi memunculkan eksepsi, yang lain mengembalikan nilai khusus. Yang paling penting adalah: kita tidak bisa mengandalkan perilaku ini . Jika
xs
kosong, ini akan berfungsi:Tetapi ini akan membuat crash program:
Untuk menghindari beberapa kejutan, saya ingin tahu kapan saya menyampaikan beberapa argumen yang tidak terduga ke suatu fungsi. Dengan kata lain: Saya ingin tahu kapan perilaku yang diamati tidak dapat diandalkan, karena itu tergantung pada implementasinya, bukan pada spesifikasinya. Tentu saja, saya dapat membaca spesifikasinya, tetapi programmer tidak selalu membaca dengan seksama dokumen.
Bayangkan jika saya memiliki cara untuk memasukkan spesifikasi ke dalam kode untuk mendapatkan efek berikut: ketika saya melanggar spesifikasi, misalnya dengan meneruskan daftar kosong
head
, saya mendapat peringatan. Itu akan sangat membantu untuk menulis program yang benar (yaitu sesuai dengan spesifikasi). Dan di situlahassert
memasuki adegan:Dan
Sekarang kita punya:
Dan:
Perhatikan bahwa
head1
melemparAssertionError
, bukanIndexError
. Itu penting karena merupakanAssertionError
tidak setiap kesalahan runtime: itu sinyal pelanggaran spesifikasi. Saya ingin peringatan, tetapi saya mendapatkan kesalahan. Untungnya, saya dapat menonaktifkan cek (menggunakan-O
opsi), tetapi dengan risiko saya sendiri. Saya akan melakukannya crash sangat mahal, dan berharap yang terbaik. Bayangkan program saya tertanam dalam pesawat ruang angkasa yang bergerak melalui lubang hitam. Saya akan menonaktifkan pernyataan dan berharap program ini cukup kuat untuk tidak crash selama mungkin.Contoh ini hanya tentang prasyarat, bisa Anda gunakan
assert
untuk memeriksa postconditions (nilai pengembalian dan / atau negara) dan invarian (keadaan kelas). Perhatikan bahwa memeriksa kondisi pos dan invarian denganassert
bisa rumit:Anda tidak akan memiliki sesuatu yang secanggih Eiffel, tetapi Anda dapat meningkatkan kualitas keseluruhan program.
Untuk meringkas,
assert
pernyataan itu adalah cara mudah untuk mendeteksi situasi yang seharusnya tidak terjadi . Pelanggaran terhadap spesifikasi (mis. Meneruskan daftar kosong kehead
) adalah kelas utama ini seharusnya tidak terjadi situasi. Oleh karena itu, sementaraassert
pernyataan dapat digunakan untuk mendeteksi situasi yang tidak terduga, itu adalah cara istimewa untuk memastikan bahwa spesifikasi terpenuhi. Setelah Anda memasukkanassert
pernyataan ke dalam kode untuk mewakili spesifikasi, kami dapat berharap Anda telah meningkatkan kualitas program karena argumen yang salah, nilai pengembalian yang salah, keadaan kelas yang salah ..., akan dilaporkan.sumber
format: menegaskan Ekspresi [, argumen] Ketika menegaskan menemukan pernyataan, Python mengevaluasi ekspresi. Jika pernyataan itu tidak benar, pengecualian dimunculkan (assertionError). Jika pernyataan gagal, Python menggunakan ArgumentExpression sebagai argumen untuk AssertionError. Pengecualian AssertionError dapat ditangkap dan ditangani seperti pengecualian lain menggunakan pernyataan coba-kecuali, tetapi jika tidak ditangani, mereka akan menghentikan program dan menghasilkan traceback. Contoh:
Ketika kode di atas dieksekusi, ia menghasilkan hasil sebagai berikut:
sumber
Dapat digunakan untuk memastikan parameter dilewatkan dalam panggilan fungsi.
sumber
if not user_key: raise ValueError()
Periksa 2 paragraf terakhir di sini: wiki.python.org/moin/UsingAssertionsEffectivelyassert
tidak boleh digunakan untuk validasi input karena validasi akan dihapus jika__debug__
adaFalse
. Juga menggunakan pernyataan untuk tujuan non-debug dapat menyebabkan orang untuk menangkap hasilAssertionError
, yang dapat membuat debug lebih sulit daripada lebih sedikit.sumber
Pada dasarnya makna kata kunci yang menegaskan adalah bahwa jika kondisi tidak benar maka melalui assertionerror lain itu melanjutkan misalnya dalam python.
kode-1
KELUARAN:
kode-2
KELUARAN:
sumber
assert
, tetapi tidak menjawab kapan harus menggunakan (atau tidak menggunakan) suatuassert
.