Anda sering mendengar bahwa Python mendorong gaya EAFP ("lebih mudah untuk meminta maaf daripada izin") daripada gaya LBYL ("lihat sebelum Anda melompat"). Bagi saya, ini masalah efisiensi dan keterbacaan.
Dalam contoh Anda (katakan bahwa alih-alih mengembalikan daftar atau string kosong, fungsinya adalah mengembalikan daftar atau None), jika Anda berharap 99% dari waktu resultitu benar-benar akan mengandung sesuatu yang dapat diubah, saya akan menggunakan try/exceptpendekatan. Akan lebih cepat jika pengecualian benar-benar luar biasa. Jika resultini Nonelebih dari 50% dari waktu, kemudian menggunakan ifmungkin lebih baik.
Untuk mendukung ini dengan beberapa pengukuran:
>>> import timeit
>>> timeit.timeit(setup="a=1;b=1", stmt="a/b") # no error checking
0.06379691968322732
>>> timeit.timeit(setup="a=1;b=1", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.0829463709378615
>>> timeit.timeit(setup="a=1;b=0", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.5070195056614466
>>> timeit.timeit(setup="a=1;b=1", stmt="if b!=0:\n a/b")
0.11940114974277094
>>> timeit.timeit(setup="a=1;b=0", stmt="if b!=0:\n a/b")
0.051202772912802175
Jadi, sementara sebuah ifpernyataan selalu membebani Anda, hampir bebas untuk membuat try/exceptblok. Tetapi ketika Exceptionbenar - benar terjadi, biayanya jauh lebih tinggi.
Moral:
- Ini sangat OK (dan "pythonic") untuk digunakan
try/exceptuntuk kontrol aliran,
- tetapi paling masuk akal ketika
Exceptions sebenarnya luar biasa.
Dari dokumen Python:
EAFP
Lebih mudah meminta maaf daripada izin. Gaya pengkodean Python yang umum ini mengasumsikan adanya kunci atau atribut yang valid dan menangkap pengecualian jika asumsi tersebut terbukti salah. Gaya bersih dan cepat ini ditandai dengan kehadiran banyak orang
trydan exceptpernyataan. Teknik ini kontras dengan
gaya LBYL yang umum untuk banyak bahasa lain seperti C.