Що означає "використання принципу EAFP" в Python? Чи можете ви навести якісь приклади?
Що означає "використання принципу EAFP" в Python? Чи можете ви навести якісь приклади?
Відповіді:
Із словника :
Простіше просити пробачення, ніж дозволу. Цей загальний стиль кодування 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 повинна двічі шукати ключ всередині словника, і його можна вважати трохи менш читабельним.
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
Спробую пояснити це на іншому прикладі.
Тут ми намагаємося отримати доступ до файлу та надрукувати вміст у консолі.
Ми можемо захотіти перевірити, чи можемо ми отримати доступ до файлу, і чи зможемо ми відкрити його та надрукувати вміст. Якщо ми не можемо отримати доступ до файлу, ми потрапимо на 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")
У цьому прикладі ми просто намагаємось відкрити файл, і якщо ми не зможемо його відкрити, він видасть 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())
Я називаю це "оптимістичним програмуванням". Ідея полягає в тому, що в більшості випадків люди роблять правильно, а помилок має бути мало. Тому спочатку кодуйте те, що відбудеться "правильна річ", а потім вловлюйте помилки, якщо їх немає.
Я відчуваю, що якщо користувач буде робити помилки, вони повинні зазнати часових наслідків. Люди, які використовують інструмент правильним шляхом, просуваються.