Последствия параллелизма EAFP / LBYL - PullRequest
4 голосов
/ 13 марта 2009

При написании параллельного / многопоточного кода на Python особенно важно следовать идиоме «Проще просить прощения, чем разрешения» (EAFP), а не «Look Before You Leap» (LBYL)? Исключительно динамичный характер Python означает, что между просмотром и прыжком может произойти почти все (например, удаление атрибута) - если да, то какой в ​​этом смысл? Например, рассмотрим

# LBYL
if hasattr(foo, 'bar'):
    baz = foo.bar

против

# EAFP
try:
    baz = foo.bar
except AttributeError:
    pass

В примере с LBYL атрибут bar может исчезнуть с foo до фактического вызова foo.bar, так что вы получаете что-нибудь от проверки? Если есть риск, что атрибут может исчезнуть, вам все равно понадобятся блокировки и / или предложения / исключения.

Одним из возможных аргументов здесь является то, что в этом примере делается крайне пессимистическое предположение о том, что работает «антагонистический код», который может в любой момент вырвать коврик из-под вас. В большинстве случаев это маловероятно.

1 Ответ

3 голосов
/ 13 марта 2009

Ваши мысли верны. Некоторые дополнительные очки:

Если атрибут существует большую часть времени, попробуйте: кроме: может быть намного быстрее, чем идиома LBYL.

Если вам не нравится синтаксис try: Кроме: вы также можете написать:

item = getattr(foo, 'bar', None)
if item is None:
    ....
else:
    ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...