Как заплатить штраф за зависимость для реализации, которую вы используете в Python? - PullRequest
3 голосов
/ 09 марта 2010

У меня довольно простой набор функций, для которых у меня есть несколько реализаций, например, хранилище данных, которое может быть поддержано 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 пакета, в котором каждый бэкэнд получал свой собственный модуль и использовал заводскую функцию, но я хотел убедиться, что я не пропустил что-то лучшее.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 10 марта 2010

Разве вы не можете просто поместить оператор import в метод __init__ каждого класса? Тогда он не будет запущен, пока вы не попытаетесь создать экземпляр:

class UnsatisfiedExample(object):
    def __init__(self):
        try:
            import flibbertigibbet
        except ImportError:
            raise RuntimeError("You need to install flibbertigibbet-py")
        super(UnsatisfiedExample, self).__init__()
4 голосов
/ 09 марта 2010

import - это просто другое утверждение, например for или with. Поместите его в оператор if, возможно, за абстракцией.

...