Python'un LBYL stili üzerinde EAFP stilini (" izin vermekten daha affetmek daha kolay") teşvik ettiğini duyuyorsunuz (" atlamadan önce bak"). Bana göre bu bir verimlilik ve okunabilirlik meselesi.
Örneğinizde (bir liste veya boş bir dize döndürmek yerine, işlevin bir liste döndürmesi Nonegerektiğini söyleyin veya ), zamanın% 99'unun resultgerçekten yinelenebilir bir şey içereceğini düşünüyorsanız, try/exceptyaklaşımı kullanacağım . İstisnalar gerçekten istisnai ise daha hızlı olacaktır. Eğer resultbir Noneo kullanarak, zamanın% 50'den fazla if, muhtemelen daha iyidir.
Bunu birkaç ölçümle desteklemek için:
>>> 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
Yani, bir ififade her zaman size mal olurken , bir try/exceptblok oluşturmak neredeyse ücretsizdir . Ancak Exceptiongerçekte meydana geldiğinde, maliyet çok daha yüksektir.
Ahlaki:
try/exceptAkış kontrolü için kullanmak tamam (ve "pitonik") ,
- ancak
Exceptions gerçekten istisnai olduğunda en mantıklıdır .
Python belgelerinden:
EAFP
Affetmek, izin vermekten daha kolaydır. Bu yaygın Python kodlama stili, geçerli anahtarların veya niteliklerin varlığını varsayar ve varsayımın yanlış olduğunu kanıtlarsa istisnaları yakalar. Bu temiz ve hızlı stil, birçok tryve exceptifadenin varlığı ile karakterizedir
. Teknik
, C gibi diğer birçok dilde ortak olan LBYL stiliyle zıttır .