2009-10-22 21 views
2

균일 한 (동일한) 인터페이스를 가진 2 개의 다른 모듈이 있다고 가정하십시오.논리 파일을 변경하지 않고 다른 모듈을로드하십시오.

root/ 
    logic.py 
    sns_api/ 
     __init__.py 
     facebook/ 
      pyfacebook.py 
      __init__.py 
     myspace/ 
      pymyspace.py 
      __init__.py 

그리고 pyfacebook.py 및 pymyspace.py 의미와 동일한 인터페이스를 가지고 : 파일은 다음과 같이 나열

# in pyfacebook.py 
class Facebook: 
    def __init__(self, a, b): 
     # do the init 
    def method1(self, a, b, ...): 
     # do the logic 

# in pymyspace.py 
class Myspace: 
    def __init__(self, a, b): 
     # do the init 
    def method1(self, a, b, ...): 
     # do the logic 

지금 내가 질문이 있습니다. logic.py 코드를 복제하지 않고 논리를 수행하고 싶습니다. 그래서 어떤 모듈을 사용하고 파이썬이 자동으로 올바른 코드를로드 하는지를 나타내는 플래그를 설정하는 것이 궁금합니다. 다음과 같은 의미입니다.

그런 다음 PLATFORM = 'myspace'를 변경하면 로직이 자동으로 작동합니다.

어떻게하면됩니까?

동적 가져 오기를 사용하거나 원시 Python 코드를 평가하는지 궁금하지만 좋은 해결책이 아닙니다. 또는 유니폼 래퍼를 만들 수 있다면

sns_api/__init__.py 

누구든지 도움을받을 수 있습니까?

답변

6

:-) "오리 통화"를 통해 사용하므로 기억의 파이썬 방법은 "오리 타이핑은" 나머지 코드에서는 라이브러리에서 이와 같이 처리됩니다 (os 모듈 참조).

name =__import__('module')을 사용하면 실제로 동적 가져 오기를 할 수 있지만이 것은 필요하지 않습니다.

0

각 모듈에 "공장"기능이 있으면 동적으로 가져 오기를 실행하고로드 된 모듈의 팩토리를 호출하십시오. 적어도, 그렇게하는 것이 하나의 방법입니다. 이 공장은 개체를 반환하고 클라이언트가 내가

if platform == 'facebook': 
    from pyfacebook import FaceBook as Platform 
elif platform == 'myspace': 
    from pymyspace import Myspace as Platform 
else: 
    raise RuntimeError, "not a valid platform" 

을하고 Platform를 사용하는 것 두으로

0

또한 간부 사용할 수 있습니다 구현 파일에서 다음

exec "from sns_api.%s import Platform" % PLATFORM 

, 플랫폼에 뭔가를 할당합니다

# in pyfacebook.py 
class Facebook: 
    def __init__(self, a, b): 
     # do the init 
    def method1(self, a, b, ...): 
     # do the logic 

Platform = Facebook