我是Python的新手,试图了解PythonWay®
我理解了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。 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

关于python - 当不知道异常的来源时,EAFP的方式是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54507074/

10-12 16:52