Что такое принцип EAFP в Python?

Что подразумевается под "использованием принципа EAFP" в Python? Не могли бы вы привести какие-либо примеры?

Ответ 1

Из glossary:

Легче просить прощения, чем разрешения. Этот общий стиль кодирования Python предполагает наличие допустимых ключей или атрибутов и исключение исключений, если предположение оказывается ложным. Этот чистый и быстрый стиль характеризуется наличием множества операторов try и except. Этот метод контрастирует с LBYL style, общим для многих других языков, таких как 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-версия должна дважды искать ключ внутри словаря и также может считаться немного менее читаемым.

Ответ 2

Я называю это "оптимистическим программированием". Идея состоит в том, что в большинстве случаев люди поступают правильно, и ошибок должно быть немного. Поэтому сначала создайте "правильные вещи", а затем поймайте ошибки, если они этого не делают.

У меня такое ощущение, что если пользователь будет совершать ошибки, он должен страдать от временных последствий. Люди, которые правильно используют инструмент, проходят через них.

Ответ 3

Я попытаюсь объяснить это другим примером.

Здесь мы пытаемся получить доступ к файлу и распечатать содержимое в консоли.

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())

Ответ 4

Свенская статья очень кратка и очень хорошо отвечает на вопрос. Однако, говоря о EAFP и LBYL, полезно прочитать исторические детали, проблемы производительности и удобочитаемости, которые очень хорошо изложены в этой статье.

https://blogs.msdn.microsoft.com/pythonengineering/2016/06/29/idiomatic-python-eafp-versus-lbyl/