При написании параллельного / многопоточного кода на 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
, так что вы получаете что-нибудь от проверки? Если есть риск, что атрибут может исчезнуть, вам все равно понадобятся блокировки и / или предложения / исключения.
Одним из возможных аргументов здесь является то, что в этом примере делается крайне пессимистическое предположение о том, что работает «антагонистический код», который может в любой момент вырвать коврик из-под вас. В большинстве случаев это маловероятно.