Python 中的 EAFP 原则是什么?

在 Python 中“使用 EAFP 原则”是什么意思? 您能提供一些例子吗?

50982 次浏览

来自 词汇表:

请求原谅比请求许可更容易。这种常见的 Python 编码风格假设存在有效的键或属性,并在假设为假时捕获异常。这种干净、快捷的风格是许多拥有属性和 except语句存在的原因。这种技术与许多其他语言(如 C 语言)通用的 LBYL 风格形成了对比。

例如,尝试访问字典键。

法新社:

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