Python中的EAFP原理是什么?

时间:2012-07-06 10:55:05

标签: python principles

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

3 个答案:

答案 0 :(得分:184)

来自glossary

  

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

一个例子是尝试访问字典密钥。

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版本必须在字典内搜索两次密钥,也可能被认为可读性稍差。

答案 1 :(得分:5)

我称之为"乐观的编程"。这个想法是,大多数时候人们会做正确的事情,错误应该很少。所以首先为#34;正确的事情编码"发生,然后如果他们不这样做就抓住错误。

我的感觉是,如果用户要犯错误,他们应该是遭受时间后果的人。以正确的方式使用该工具的人将加快速度。

答案 2 :(得分:1)

我将尝试通过另一个示例对其进行解释。

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

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