即使已经回答,这对于评论来说太长了,所以我将添加另一个答案。
一般来说,进行类型检查有两个原因:确保您的函数真正完成,并避免因错误输出而导致难以调试的下游故障。
对于第一个问题,答案总是合适的——EAFP 是正常的方法。而且您不必担心输入错误。
对于第二个......答案取决于您的正常用例,您确实担心输入错误/错误。当错误输入总是产生异常时(其中“错误输入”可以限制为您的应用程序可能期望产生的错误输入类型),EAFP 仍然是合适的(并且它更容易,更易于调试)。但是,如果错误的输入可能会产生有效的输出,那么 LYBL 可能会让您以后的生活更轻松。
示例:假设您调用 square(),将此值放入字典中,然后(很多)稍后从字典中提取此值并将其用作索引。当然,索引必须是整数。
square(2) == 4,是一个有效的整数,所以是正确的。square('a') 总是会失败,因为 'a'*'a' 是无效的,并且总是会抛出异常。如果只有这两种可能性,那么您可以安全地使用 EAFP。如果你确实得到了错误的数据,它会抛出一个异常,生成一个回溯,你可以用 pdb 重新启动,并很好地指示出了什么问题。
但是...假设您的应用程序使用了一些 FP。并且有可能(假设你有一个错误!当然不是正常操作)你不小心调用了 square(1.43)。这将返回一个有效值 - 2.0449 左右。您不会在这里遇到异常,因此您的应用程序会很乐意将 2.0449 放入字典中。很久以后,您的应用程序会将这个值从字典中拉出,将其用作列表的索引,然后 - 崩溃。您将获得回溯,您将使用 pdb 重新启动,并意识到这对您根本没有帮助,因为该值是很久以前计算的,您不再拥有输入,也不知道该数据是如何获得的那里。这些调试起来并不有趣。
在这些情况下,您可以使用断言(LYBL 的特殊形式)更早地检测这些类型的错误,或者您可以明确地进行。如果您没有调用该函数的错误,那么任何一个都可以工作。但是如果你这样做了......那么你真的会很高兴你在接近失败时人为地检查了输入,而不是自然而然地在你的应用程序中的某个随机位置。