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 result
itu benar-benar akan mengandung sesuatu yang dapat diubah, saya akan menggunakan try/except
pendekatan. Akan lebih cepat jika pengecualian benar-benar luar biasa. Jika result
ini None
lebih dari 50% dari waktu, kemudian menggunakan if
mungkin 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 if
pernyataan selalu membebani Anda, hampir bebas untuk membuat try/except
blok. Tetapi ketika Exception
benar - benar terjadi, biayanya jauh lebih tinggi.
Moral:
- Ini sangat OK (dan "pythonic") untuk digunakan
try/except
untuk kontrol aliran,
- tetapi paling masuk akal ketika
Exception
s 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
try
dan except
pernyataan. Teknik ini kontras dengan
gaya LBYL yang umum untuk banyak bahasa lain seperti C.