2010-03-09 1 views
3

Redis, MongoDB 또는 PostgreSQL으로 백업 할 수있는 데이터 저장소와 같이 여러 가지 구현이있는 매우 간단한 기능 집합이 있습니다. 이러한 구현 중 하나를 사용하려는 코드가 Redis 백엔드를 사용하는 경우 psycopg2을 설치할 필요가없는 등 해당 구현에 대한 종속성 만 필요하도록 코드를 구조화/작성해야합니다.Python에서 사용하는 구현에 대한 종속성 패널티 만 지불하는 방법은 무엇입니까?

다음은 예입니다. 다음 모듈을 가정하십시오 : example.py.

>>> import example 
You need to install flibbertigibbet-py 

대안 : 내가 UnsatisfiedExample의 인스턴스를 시도 할 때까지

>>> from example import RedisExample 
You need to install flibbertigibbet-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__() 

여기 내 파이썬 쉘 경험입니다. 이 문제에 접근하기위한 일반적인 방법이 있습니까? example 각각의 백엔드가 자체 모듈을 가져오고 팩토리 함수를 사용하여 패키지를 만드는 것에 대해 생각해 봤지만 더 나은 것을 놓치지 않았는지 확인하려고했습니다.

감사합니다.

+2

놀라운 놀음을받은 후 전체 질문이 제목에 ...? –

+0

제목을 집중하고 몸에 세부 정보를 제공하는 데 도움이 될 수 있습니다. 세부 정보가 도움이됩니다. 원하는 코드가 실제로 도움이되는지 보여주는 코드입니다. –

+0

죄송합니다. 신생아가 있습니다. 신생아가 있으므로, 집중할 수있는 능력이 1 분 뒤에 있습니다. 나는 개정하려고 노력할 것이다. –

답변

5

각 클래스의 __init__ 메서드에 import 문을 넣을 수는 없습니까? 그런 다음 인스턴스를 만들려고 시도 할 때까지 실행되지 않습니다.

class UnsatisfiedExample(object): 
    def __init__(self): 
     try: 
      import flibbertigibbet 
     except ImportError: 
      raise RuntimeError("You need to install flibbertigibbet-py") 
     super(UnsatisfiedExample, self).__init__() 
+0

또한 lib를 인스턴스 변수에 저장할 수 있으므로 나중에 클래스 내부에서 액세스 할 수 있습니다.'''try : import flibbertigibbet; self.fg = flibbertigibet''' – gaborous

4

importfor 또는 with과 같은 또 다른 문장입니다. 가능하면 추상 클래스 뒤의 if 문에 넣습니다.

+0

더 자세한 내용을 제공하기 위해 질문을 수정했습니다. 언급 한 추상화 클래스 아이디어의 예를 게시하고 이것이 내 (잘하면 더 명확해진) 문제를 어떻게 해결할 수 있습니까? –

+0

내 대답은 변하지 않습니다. 필요할 때 가져 오기를 수행하십시오. –

+0

클라이언트 코드가'import example' 대신'example import RedisExample'에서 간단히 수행하도록 제안 하시겠습니까? 이것은 또한 ImportError를 트리거하기 때문입니다. –

관련 문제