我是Python的新手,正试图了解Python方式®
我了解 EAFP 原理并且很喜欢,但是在该示例中如何应用?
编辑:我只关心 item 没有 children 属性,而不关心dosomethingwith()内部发生了什么。
在我对EAFP的理解中,我应该像往常一样使用可能错误的语句,并捕获异常,但是由于该语句位于 for 中,因此我不得不尝试对整个块进行尝试。 / p>
try:
for child in item.children:
dosomethingwith( child )
except AttributeError:
""" did the exception come from item.children or from dosomethingwith()? """
尽管如此,看起来很像LBYL:
try:
item.children
except AttributeError:
""" catch it """
for child in item.children: ...
答案 0 :(得分:2)
实际上,当您要访问可能不可用的资源时,可以使用EAFP。 IMO,AttributeError
是一个不好的例子……
无论如何,您可以在缺少的children
属性和从AttributeError
函数引发的do_something_with()
之间进行区分。您需要具有两个异常处理程序:
try:
children = item.children
except AttributeError:
print("Missing 'children' attribute")
raise # re-raise
else:
for child in children:
try:
do_something_with(child)
except AttributeError:
print("raised from do_something_with()")
raise # re-raise
EAFP的经典示例是make_dir_if_not_exist()
函数:
# LBYL
if not os.path.exists("folder"):
os.mkdir("folder")
# EAFP
try:
os.mkdir("folder")
except FileExistsError:
pass