Answers:
从词汇表中:
寻求宽恕比允许容易。这种通用的Python编码风格假设存在有效的键或属性,并且在假设被证明为假的情况下捕获异常。这种干净快捷的样式的特点是存在许多
try
和except
声明。该技术与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版本必须在字典中搜索关键字两次,并且可能还被认为可读性较差。
x
键不存在时,Python还提供了一种避免这两种方法的方法:如果not in ,x = mydict.get('key')
则返回;您也可以这样做,然后如果键不在字典中,则x将被分配一些东西。而对于避免过多的代码以及好东西。None
'key'
my_dict
.get('key', <something>)
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())