Python 当异常源未知时,EAFP的方式是什么?

Python 当异常源未知时,EAFP的方式是什么?,python,python-3.x,Python,Python 3.x,我是Python新手,正在尝试理解Python way® 我得到了EAFP原则,我喜欢它,但是在本例中如何应用它 编辑:我只关心没有子项属性的项,而不关心dosomethingwith()内部发生了什么。 在我对EAFP的理解中,我应该像往常一样使用可能错误的语句,并捕获异常,但是由于该语句位于for中,因此我不得不尝试整个for块 try: for child in item.children: dosomethingwith( child ) except Attri

我是Python新手,正在尝试理解Python way®
我得到了EAFP原则,我喜欢它,但是在本例中如何应用它

编辑:我只关心没有子项属性的项,而不关心dosomethingwith()内部发生了什么。
在我对EAFP的理解中,我应该像往常一样使用可能错误的语句,并捕获异常,但是由于该语句位于for中,因此我不得不尝试整个for块

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: ...

实际上,当您想要访问可能不可用的资源时,可以使用EAFP。依我看,
AttributeError
就是一个坏例子

无论如何,您可以在缺少的
子属性
和从
do\u something\u with()
函数中引发的
属性错误
之间进行区分。您需要有两个异常处理程序:

试试看:
children=item.children
除属性错误外:
打印(“缺少“子项”属性”)
升起#重新升起
其他:
对于儿童中的儿童:
尝试:
和(孩子)做点什么
除属性错误外:
打印(“从do_something_with()
升起#重新升起
EAFP的一个典型示例是
make\u dir\u if\u not\u exist()
函数:

#LBYL
如果操作系统路径不存在(“文件夹”):
mkdir(“文件夹”)
#EAFP
尝试:
mkdir(“文件夹”)
除文件ExistError外:
通过

您将
try
放在
for
循环中,而不是封装整个循环afp:请求原谅比获得许可更容易。@roganjosh我编辑了这个问题,明确表示我只想尝试捕捉for表达式,而不是整个表达式block@LaurentLAPORTE正确的,但是有没有办法不在这里请求许可呢?在我看来,在实际使用它之前尝试item.children更像是请求许可而不是请求原谅。谢谢,我没有具体说明的是,我关心的唯一属性错误是item.children,所以基本上我的第二个示例与你的答案几乎相同,只是我觉得它有点像LBYL。