为什么异常处理不检查库的存在

ach*_*uns -2 python exception-handling

我不明白为什么python(至少2.7)没有验证错误的异常处理机制.

例:

try:
    some code selecting data from pymongo
except pymongo.errors.OperationFailure:
    exception
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果第一次没有调用异常,python将不会验证我是否确实导入了pymongo lib.

知道为什么吗?

kin*_*all 6

如果我正确地阅读您的问题,您想知道为什么except pymongo.errors.OperationFailure在加载模块时不会导致错误(如果您尚未导入pymongo模块).

与Python中的大多数内容一样,except子句的参数在运行时进行评估.事实上,他们可以是表达!Python不会在"编译"时验证它们,而是在那时验证任何其他名称.

原因是Python是一种动态语言.进口可以有条件进行,或者基于未在"编译"时已知的名称,以及模块和其它的命名空间可被替换执行,修改,或通过代码移除.因此,Python无法pymongo.errors.OperationFailure在不运行代码的情况下知道代码执行中的那个点是否是有效名称.

  • `pylint`是一个很好的工具来捕获这些问题,你可以用动态语言对代码进行静态分析. (4认同)