为什么“请求宽恕比获得许可更容易”(EAFP https://docs.python.org/2/glossary.html#term-eafp)在Python中被认为是好的实践吗?作为一名编程新手,我的印象是使用很多try...except
与使用其他检查相比,例程宁愿导致代码臃肿且可读性较差。
EAFP 方法的优点是什么?
注意:我知道这里也有类似的问题,但它们大多指的是一些具体的例子,而我对原理背后的哲学更感兴趣。
您在这里混合了两件事:断言和基于 EAFP 的逻辑。
断言用于验证函数的契约,即其前置条件和后置条件,有时还有其不变量。它们确保函数按照应有的方式使用。但它们不适用于代码流,因为它们会在出现错误时完全中断执行。一个常见的例子是检查None
函数调用中的参数。
在 Python 中,通常避免过多使用断言。一般来说,您应该expect您的代码的用户正确使用它。例如,如果您记录了一个函数,该函数接受的参数不是None
,那么就没有必要有一个断言来验证这一点。相反,只是期望有一个值。如果由于 None 值而出现错误,那么无论如何它都会冒泡,因此用户知道他们做错了什么。但您不必一直检查所有内容。
现在,EAFP 有所不同。它用于控制流,或者更确切地说,它避免了额外的控制流,有利于期望事情是正确的,并在不正确时捕获异常。显示差异的一个常见示例是字典中的键访问:
# LBYL
if key in dic:
print(dic[key])
else:
handleError()
# EAFP
try:
print(dic[key])
except KeyError:
handleError()
现在这看起来非常相似,尽管您应该记住 LBYL 解决方案会检查字典twice。与捕获异常的所有代码一样,只有当某个键不存在时才应该执行此操作。特殊情况。因此,如果通常情况下,提供的密钥不在字典中,那么它就是 EAFP,您应该直接访问它。如果你不希望字典中出现该键,那么你应该首先检查它是否存在(虽然 Python 中的异常更便宜,但它们仍然不是免费的,所以保留它们以备特殊情况使用)。
EAFP 的一个好处还在于,在您的库或应用程序的逻辑深处,key
来自上面,您可以假设这里传递了有效的密钥。因此,您不需要在这里捕获异常,而只需让它们冒泡到代码中的更高点,然后您就可以在其中处理错误。这使您可以拥有完全不受此类检查的较低级别的函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)