2013-08-20 4 views
0

일부 조건에 따라 클래스를 동적으로 가져 오려고합니다.조건에 따른 파이썬 모듈 사용

class Test(object): 
     def __init__ (self,condition): 
      if condition: 
       import module1 as mymodule 
      else: 
       import module2 as mymodule 

      self.mymodule = mymodule 

     def doTest(self): 
      self.mymodule.doMyTest 

여기서 module1과 module2는 다른 방법으로 doMyTest를 구현합니다.

이 작동하지만 가능성이 더 관용적 방법이
mytest1 = Test(true) # Use module1 
    mytest2.doTest() 

    mytest2 = Test(false) # Use module2 
    mytest2.doTest() 

로 호출? 가능한 문제가 있습니까?

+0

이 정말 _quite_ 작동하지 않습니다 뿐만 아니라 당신이 생각하기에 ... 그러나 그것은 수입 진술이 전 세계적으로 그리고 지역적으로 어떤 일을하는지에 관한 것이며, 조건들과는 아무 상관이 없습니다. – abarnert

+0

* 검사 할 상태의 실제 특성에 따라 더 관용적 인 방법 일 수 있습니다. 어떤 문제를 해결하려고합니까? – SingleNegationElimination

+0

테스트 된 객체의 범주에 따라 테스트 메소드의 실제 구현이 다른 테스트 스위트를 개발하려고합니다. – peterk

답변

1

물론 보통 __init__ 메소드의 중간에 모듈을 가져오고 싶지는 않지만 테스팅 클래스는 그 규칙에 대한 명백한 예외이므로이 부분을 무시하고 최상위 레벨에서 이것을 수행한다고 가정 해 보겠습니다.

if test_c_implementation: 
    import c_mymodule as mymodule 
else: 
    import py_mymodule as mymodule 

그건 완전히 관용적입니다. 사실, stdlib와 핵심 개발자가 작성한 다른 코드와 같은 코드를 볼 수 있습니다. 그냥 이렇게하는 것이 더 관용적의 경우에 조건이 예외를 피하기 위해 단지가 매우 - 일반적인 EAFP가지 경우,를 제외하고

: 사실

try: 
    import lxml.etree as ET 
except ImportError: 
    import xml.etree.cElementTree as ET 
+0

고맙습니다. 필자의 경우 가져 오기는 __init__이 아닌 다른 Test 메서드에 배치 될 수 있습니다. 필자는 모듈 참조를 Test 속성으로 전달하는 것이 유효한 Python 기술인지 여부에 더 관심이 있습니다. – peterk

+0

@peterk : _any_ 메소드에서 그렇게하는 것만큼이나''__init__''에 대해서는 그리 많지 않았습니다. 그리고 요점은 : 그것은 이상한 일입니다. 그 유일한 확실한 용도는 테스트 라이브러리에있는 것입니다 ... 당신이 쓰고있는 것과 정확히 일치합니다. 그래서 그것이 이상하다는 것은 중요하지 않습니다. – abarnert

+0

@peterk : 어쨌든, 모듈은 최상위 클래스의 값이며 다른 네임 스페이스와 마찬가지로 네임 스페이스이기 때문에 확실히 전달할 수 있습니다 _ 속성 _으로 저장합니다 _ 대부분의 모듈은 실제로 설계되지 않았습니다 _ (stdlib에서도'random'은'random.Random' 인스턴스와 완전히 동일한 API를가집니다), 다시 한번 테스트 라이브러리가 모듈을 생각하는 것이 합리적일지도 모릅니다 모듈의 일반 사용자가 그렇지 않더라도 값으로. – abarnert