Каков принцип EAFP в Python?
Что подразумевается под "использованием принципа EAFP" в Python? Не могли бы вы привести примеры?
4 ответа
Из глоссария:
Проще просить прощения, чем разрешения. Этот общий стиль кодирования Python предполагает наличие допустимых ключей или атрибутов и перехватывает исключения, если предположение оказывается ложным. Этот чистый и быстрый стиль характеризуется наличием многих
try
а такжеexcept
заявления. Техника контрастирует со стилем LBYL, общим для многих других языков, таких как C.
Примером может служить попытка получить доступ к ключу словаря.
ЭСПЦ:
try:
x = my_dict["key"]
except KeyError:
# handle missing key
LBYL:
if "key" in my_dict:
x = my_dict["key"]
else:
# handle missing key
Версия LBYL должна дважды искать ключ в словаре, и ее также можно считать немного менее читаемой.
Попробую пояснить на другом примере.
Здесь мы пытаемся получить доступ к файлу и распечатать его содержимое в консоли.
LBYL - Посмотрите, прежде чем прыгать:
Мы могли бы захотеть проверить, можем ли мы получить доступ к файлу, и если мы можем, мы откроем его и распечатаем содержимое. Если мы не можем получить доступ к файлу, мы нажмемelse
часть. Причина, по которой это состояние гонки, заключается в том, что мы сначала выполняем проверку доступа. К тому времени, когда мы достигнемwith open(my_file) as f:
возможно, мы больше не можем получить к нему доступ из-за некоторых проблем с разрешениями (например, другой процесс получает эксклюзивную блокировку файла). Этот код, скорее всего, выдаст ошибку, и мы не сможем ее отловить, потому что думали, что можем получить доступ к файлу.
import os
my_file = "/path/to/my/file.txt"
# Race condition
if os.access(my_file, os.R_OK):
with open(my_file) as f:
print(f.read())
else:
print("File can't be accessed")
EAFP - Проще просить прощения, чем разрешения:
В этом примере мы просто пытаемся открыть файл, и если мы не можем его открыть, он выдаст IOError
. Если сможем, мы откроем файл и распечатаем его содержимое. Поэтому вместо того, чтобы спрашивать что-то, мы пытаемся это сделать. Если работает - отлично! Если этого не происходит, мы перехватываем ошибку и обрабатываем ее.
# # No race condition
try:
f = open(my_file)
except IOError as e:
print("File can't be accessed")
else:
with f:
print(f.read())
Я называю это "оптимистическим программированием". Идея состоит в том, что в большинстве случаев люди будут поступать правильно, и ошибок должно быть немного. Поэтому сначала создайте "правильную вещь", а затем поймайте ошибки, если они этого не делают.
У меня такое ощущение, что если пользователь будет совершать ошибки, он должен страдать от временных последствий. Люди, которые правильно используют инструмент, проходят через них.
Добавить@sven-marnach
отвечать,
Вы можете использовать:
dict[“key”] = dict.get(“key”, None)
Это лучше, чем проблема с двойным поиском, о которой он упоминает при выполнении LBYL.