Как проверить ситуацию, когда в Python отсутствует конкретная библиотека - PullRequest
2 голосов
/ 20 декабря 2010

У меня есть несколько пакетов, которые имеют мягкие зависимости от других пакетов с возвратом к стандартной (простой) реализации.

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

Существует ли пакет или способ достижения следующего:

import X

работает как обычно, но

hide_package('X')
import X

вызовет ошибку ImportError.

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

Ответы [ 2 ]

2 голосов
/ 21 декабря 2010

Это выглядит немного грязно, но вы можете переопределить встроенную функцию __import__:

save_import = __builtin__.__import__
def my_import(name, *rest):
    if name=="hidden":
        raise ImportError, "Hidden package"
    return save_import(name, *rest)
__builtin__.__import__ = my_import

Кстати, вы читали PEP 302?Кажется, что вы можете сделать более надежный механизм с помощью ловушек для импорта.

2 голосов
/ 20 декабря 2010

Один из способов - отредактировать sys.path, особенно если ваши пакеты устанавливаются в разные каталоги / zip-файлы (например, если вы используете яйца). Перед импортом удалите ненужные файлы из sys.path.

Если это неосуществимо (поскольку все компоненты находятся в одной записи sys.path), вы можете взломать подавление в самих пакетах. Например. иметь глобальную переменную (окружение или что-то исправленное в модуле sys), список пакетов, при импорте которых вы хотите потерпеть неудачу:

sys.suppressed_packages=set()
sys.suppressed_packages.add('X')

Затем в каждом пакете явно вызывается ошибка ImportError:

# X.py
import sys
if 'X' in sys.suppressed_packages:
    raise ImportError, 'X is suppressed'

Конечно, вместо использования модуля sys вы можете создать для этого собственную инфраструктуру вместе с функцией hide_package.

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