Что подразумевается под «использованием принципа EAFP» в Python? Не могли бы вы привести примеры?
python
principles
Неоплаченные оракулы
источник
источник
Ответы:
Из глоссария :
Примером может служить попытка получить доступ к ключу словаря.
ЭСПЦ:
LBYL:
Версия LBYL должна дважды искать ключ в словаре, и ее также можно считать немного менее читаемой.
источник
x
когда ключ не существует:x = mydict.get('key')
вернет,None
если'key'
не вmy_dict
; Вы также можете это сделать.get('key', <something>)
, и тогда x будет назначен что-то, если ключ отсутствует в словаре.dict.setdefault()
иcollections.defaultdict
хорошие вещи для того, чтобы избежать лишнего кода.except KeyError
также, какAttributeError
простые, но некоторые из худших примеров. Очень много раз я застревал, отлаживая что-то, потому что онexcept AttributeError
был помещен в неправильное место, что в итоге перехватывало неверную атрибутивную ошибку, возникшую глубже в цепочке. Лучшие примеры , которые я думаю , являются:try: open() ... except: IOError
. Илиtry: parseLine() ... except ParseError
Я попытаюсь объяснить это другим примером.
Здесь мы пытаемся получить доступ к файлу и распечатать содержимое в консоли.
LBYL - Смотри, прежде чем прыгать
Возможно, мы захотим проверить, можем ли мы получить доступ к файлу, и если мы сможем, мы откроем его и распечатаем содержимое. Если мы не можем получить доступ к файлу, мы попадем на
else
часть. Причина, по которой это условие гонки, заключается в том, что мы сначала проводим проверку доступа. К тому времени, когда мы достигаем,with open(my_file) as f:
возможно, мы больше не можем получить к нему доступ из-за некоторых проблем с разрешениями (например, другой процесс получает эксклюзивную блокировку файла). Этот код, скорее всего, выдаст ошибку, и мы не сможем ее отследить, потому что думали, что можем получить доступ к файлу.EAFP - проще просить прощения, чем разрешения:
В этом примере мы просто пытаемся открыть файл, и если мы не можем открыть его, он выдаст
IOError
. Если мы сможем, мы откроем файл и распечатаем его содержимое. Таким образом, вместо того, чтобы спросить что-то, мы пытаемся это сделать. Если это работает, отлично! Если это не так, мы ловим ошибку и обрабатываем ее.источник
Я называю это «оптимистическим программированием». Идея состоит в том, что в большинстве случаев люди будут поступать правильно, и ошибок должно быть немного. Поэтому сначала создайте «правильные вещи», а затем поймайте ошибки, если они этого не делают.
У меня такое ощущение, что если пользователь будет совершать ошибки, он должен страдать от временных последствий. Люди, которые правильно используют инструмент, проходят через них.
источник