Ви часто чуєте, що Python заохочує стиль EAFP ("простіше просити пробачення, ніж дозволу") над стилем LBYL ("дивись, перш ніж стрибнути"). Для мене це питання ефективності та читабельності.
У вашому прикладі (скажіть, що замість повернення списку чи порожнього рядка функцією було повернення списку або None
), якщо ви очікуєте, що 99% часу result
насправді буде містити щось ітерабельне, я використовував би такий try/except
підхід. Це буде швидше, якщо справді винятки будуть винятковими. Якщо result
це None
більш ніж на 50% часу, то з допомогоюif
, напевно , краще.
Щоб підтримати це за допомогою декількох вимірювань:
>>> 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
Отже, хоча if
заява завжди коштує вам, налаштовувати try/except
блок майже безкоштовно . Але коли Exception
насправді відбувається, вартість значно вища.
Мораль:
- Це абсолютно добре (і "пітонічний") у використанні
try/except
для контролю потоку,
- але це має сенс, коли
Exception
s насправді виняткові.
З документів Python:
ЄАФП
Простіше просити пробачення, ніж дозволу. Цей загальний стиль кодування Python передбачає існування дійсних ключів або атрибутів і виловлює винятки, якщо припущення виявиться помилковим. Цей чистий і швидкий стиль характеризується наявністю багатьох
try
і except
висловлювань. Метод контрастує зі
стилем LBYL, поширеним для багатьох інших мов, таких як C.