У меня довольно простой набор функций, для которых у меня есть несколько реализаций, например, хранилище данных, которое может быть поддержано Redis, MongoDB или PostgreSQL. Как я должен структурировать / написать свой код так, чтобы код, который хочет использовать одну из этих реализаций, нуждался только в зависимостях для этой реализации, например, им не нужно устанавливать psycopg2
, если они используют бэкэнд Redis. *
Вот пример. Предположим, что следующий модуль, example.py
.
class RedisExample(object):
try:
import redis
except ImportError:
print("You need to install redis-py.")
def __init__(self):
super(RedisExample, self).__init__()
class UnsatisfiedExample(object):
try:
import flibbertigibbet
except ImportError:
print("You need to install flibbertigibbet-py")
def __init__(self):
super(UnsatisfiedExample, self).__init__()
Вот мой опыт работы с оболочкой Python:
>>> import example
You need to install flibbertigibbet-py
С другой стороны:
>>> from example import RedisExample
You need to install flibbertigibbet-py
Я бы предпочел, чтобы я не получил эту ошибку, пока не попытался создать экземпляр UnsatisfiedExample
. Есть ли какой-нибудь общий способ решения этой проблемы? Я думал о создании example
пакета, в котором каждый бэкэнд получал свой собственный модуль и использовал заводскую функцию, но я хотел убедиться, что я не пропустил что-то лучшее.
Спасибо.