Почему обработка исключений не проверяет существование библиотеки - PullRequest
0 голосов
/ 30 ноября 2011

Я не понимаю, почему python (по крайней мере, 2.7) не проверяет механизм обработки исключений для ошибок.

Пример:

try:
    some code selecting data from pymongo
except pymongo.errors.OperationFailure:
    exception

В этом случае, если исключение не вызывается в первый раз, python не будет проверять, если я действительно импортировал библиотеку pymongo.

Есть идеи почему?

Ответы [ 3 ]

6 голосов
/ 30 ноября 2011

Если я правильно понял ваш вопрос, вы хотите знать, почему except pymongo.errors.OperationFailure не вызывает ошибку при загрузке модуля, если вы еще не импортировали модуль pymongo.

Как и большинство вещей в Python, аргументы предложений except оцениваются во время выполнения.На самом деле, они могут быть выражениями!Python не проверяет их во время «компиляции» больше, чем любые другие имена в то время.

Причина в том, что Python является динамическим языком.Импорт может быть выполнен условно или выполнен на основе имен, которые не известны во время «компиляции», а модули и другие пространства имен могут быть заменены, изменены или удалены кодом.В результате Python буквально не может знать, является ли pymongo.errors.OperationFailure допустимым именем в тот момент выполнения вашего кода без запуска вашего кода.

1 голос
/ 30 ноября 2011

Прежде всего, pymongo.errors.OperationFailure может быть определено где угодно , не только как часть модуля pymongo, но также как свойство свойства объекта pymongo, определенного в том же файле.

Таким образом, при обработке исключений Python не должен проверять, был ли импортирован определенный модуль .

Но если вы сделаете что-то подобное:

import pymongo

вы увидите, что ошибка импорта действительно возникает, если модуль не найден :

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    import pymongo
ImportError: No module named pymongo

Если моего ответа вам недостаточно, и вы хотите узнать больше о том, почему включение pymongo.errors.OperationFailure не выдает никакой ошибки при первом запуске сценария, даже если у вас нет оператора import pymongo в вашем коде, пожалуйста, смотрите ответ kindall о том, что Python является динамическим языком .

1 голос
/ 30 ноября 2011

Согласно документации PyMongo, исключение pymongo.errors.OperationFailure будет «возбуждено при сбое операции с базой данных». Таким образом, ваш except блок оценивается только при возникновении такой ошибки.

Я предполагаю, что под «проверкой существования пимонго» вы подразумеваете что-то вроде:

try:
   import pymongo
except:
   print("PyMongo not found!")
   sys.exit(-1)

Этот метод часто используется для обеспечения откатов (и обратной совместимости), чтобы не "проверять" импорт . Например, в случае кодера / декодера json мы можем попробовать, есть ли у нас доступная библиотека simplejson, и использовать библиотеку json в качестве запасного варианта следующим образом:

try:
   import simplejson as json
except ImportError:
   import json

Предполагая, что в начале вашего сценария у вас уже есть import pymongo, я не вижу причины, по которой вам следует проверять или «проверять», что pymongo был импортирован: import pymongo уже вызовет ImportError если pymongo библиотека не найдена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...