165

Python中的“使用EAFP原则”是什么意思?你能提供任何例子吗?

4

3 回答 3

260

词汇表

请求宽恕比请求许可更容易。这种常见的 Python 编码风格假设存在有效的键或属性,如果假设被证明是错误的,则捕获异常。这种干净快速的风格的特点是存在许多tryexcept陈述。该技术与许多其他语言(如 C)常见的LBYL 风格形成鲜明对比。

一个示例是尝试访问字典键。

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 版本必须在字典中搜索关键字两次,并且可能也被认为可读性稍差。

于 2012-07-06T10:56:31.237 回答
24

我将尝试用另一个例子来解释它。

在这里,我们尝试访问文件并在控制台中打印内容。

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())
于 2019-05-08T08:50:16.887 回答
7

我称之为“乐观编程”。这个想法是大多数时候人们会做正确的事情,错误应该很少。因此,首先编写代码以使“正确的事情”发生,然后在错误发生时捕获错误。

我的感觉是,如果用户要犯错误,他们应该是承担时间后果的人。以正确方式使用该工具的人被加速通过。

于 2018-05-29T05:28:06.610 回答