在Python中,“使用EAFP原则”是什么意思?你能给出任何例子吗?
从词汇表中:
宁愿请求原谅,也不要事先获得许可。这种常见的 Python 代码风格假定存在有效的键或属性,并在此假设被证明错误时捕获异常。这种简洁而快速的风格特点是有很多
try
和except
语句。该技术与许多其他语言(如 C)常用的 LBYL 风格形成对比。
尝试访问字典键的示例。
EAFP:
try:
x = my_dict["key"]
except KeyError:
# handle missing key
LBYL:
(注:该缩写代表Look Before You Leap,意为先看后跳)if "key" in my_dict:
x = my_dict["key"]
else:
# handle missing key
使用LBYL版本需要在字典中搜索两次键,并且可能被认为稍微不够易读。
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())
else
块是完全不必要的 - 那段代码应该是 try
块的一部分。 - Mark Ransom@sven-marnach
添加为回答者,
你可以使用:dict[“key”] = dict.get(“key”, None)
这比他提到的为了做LBYL而进行两次搜索的问题要好。
x
赋一个默认值:当'key'
不在my_dict
中时,x = mydict.get('key')
将返回None
;你也可以使用.get('key', <something>)
,如果字典中没有这个键,那么 x 将被赋予这个 something。dict.setdefault()
和collections.defaultdict
也是避免增加额外代码的好工具。 - JABexcept KeyError
和AttributeError
是简单但最糟糕的例子之一。很多时候,由于将except AttributeError
放在错误的位置,导致捕获了更深层次链中抛出的错误属性。我认为更好的例子是:try: open() ... except: IOError
。或者try: parseLine() ... except ParseError
。 - Skiexcept Exception
可以捕获任何可能发生的问题,但最好还是明确地捕获错误。(请注意,此示例包括显式异常语句。) - DaveL17