Вопрос-Ответ

What is the EAFP principle in Python?

Каков принцип EAFP в Python?

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

Переведено автоматически
Ответ 1

Из глоссария:


Проще попросить прощения, чем разрешения. Этот распространенный стиль программирования на Python предполагает существование допустимых ключей или атрибутов и улавливает исключения, если предположение оказывается ложным. Этот чистый и быстрый стиль характеризуется наличием множества операторов try и except. Этот метод контрастирует со стилем LBYL, общим для многих других языков, таких как C.


Примером может служить попытка получить доступ к ключу словаря.

EAFP:

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

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

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

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())
Ответ 3

I call it "optimistic programming". The idea is that most times people will do the right thing, and errors should be few. So code first for the "right thing" to happen, and then catch the errors if they don't.

My feeling is that if a user is going to be making mistakes, they should be the one to suffer the time consequences. People who use the tool the right way are sped through.

Ответ 4

To add @sven-marnach to answer,

You could use:

dict[“key”] = dict.get(“key”, None)

This is better than the search twice issue he mentions for doing LBYL.

2023-08-18 02:33 python