Netaddr возвращает NameError вместо ImportError - PullRequest
0 голосов
/ 28 января 2019

Модуль Python netaddr пропускает ImportError.Мне пришлось создать функцию для использования try / finally, чтобы перехватить ImportError, а затем повторить попытку /, за исключением возврата значения печати.Интересно, есть ли более простой способ перехватить ImportError ??

import json
import base64
try:
    netaddr_mod()
except:
    print("ImportError: pip install netaddr")

def netaddr_mod():
    try:
        import netaddr
    finally:
        import netaddr 

Я видел некоторые другие исправления в глобальных переменных, но ничего похожего на это исправление импорта.Было бы здорово найти более простой способ обойти это, но сейчас этот способ может сработать.

1 Ответ

0 голосов
/ 28 января 2019

В Python функция не существует, пока ее не определит оператор def.Поэтому, если вы позвоните ему раньше его определения, вы получите NameError.

Итак, определите netaddr_mod() перед тем, как попытаться вызвать его.В противном случае строка 4 вашего кода повысит NameError.Сообщение говорит , что это ImportError, но ваш код на самом деле не проверяет, что является исключением.Если вы измените код следующим образом:

try:
    netaddr_mod()
except:
    print("ImportError: pip install netaddr")
    raise

Вы получите

ImportError: pip install netaddr
Traceback (most recent call last):
  File "<pyshell#50>", line 2, in <module>
    netaddr_mod()
NameError: name 'netaddr_mod' is not defined

Здесь вы увидите сообщение о том, что вы думаете ImportError, и следговорит вам, что на самом деле является исключением.

Мораль: Не используйте голые исключения, потому что они маскируют или искажают другие проблемы с кодом.Сделайте явное except ImportError:, если вы пытаетесь перехватить ошибки импорта.Тогда, если вы получите другое исключение, вы хотя бы узнаете, что это такое.

...