2011-11-12 3 views
0

저는 config.cfg 파일을 python 모듈 ConfigParser를 사용하여 파싱했습니다. 한 섹션에서는 fileextension : ClassName 양식의 지정을 구성하려고합니다. 내가 지금 할 수있는 알고 :config-file에 정의 된 python-class를 동적으로 호출합니다.

class_ = eval(types[extension]) 
foo = class() 

을하지만이 eval 악하고 사용하지 않아야 것을 이해하는 것이 주어진

types = { 
    "extension1" : "ClassName1", 
    "extension2" : "ClassName2" 
} 

편집 : 다음 사전에 결과를 구문 분석.

어떤 파일 확장명 결과가 어떤 클래스에 동적으로 구성되는지 더 잘 알고 있습니까? (클래스가! 범위에있는 경우),하지만, 설정 파일의 클래스 이름이 정확히 파이썬 코드에서 클래스 이름과 일치하는 경우

답변

3

당신은 eval을 사용할 수 있습니다 ..... 평가는 (입니다 하나 개의 편지 차이가 ​​있음을 우연의 일치? 난 그렇게 생각하지 않는다!)


는 파이썬 클래스 이름으로 구성 클래스 이름에서 매핑 추가 사전을 추가하는 것입니다 할 수있는 안전한 방법입니다. 때문에 나는이 작업을 수행 할 것 : 구성 파일

  • 이 코드를 변경하지 않고 설정 파일을 변경할 수 있으며, 그 반대의 경우도 마찬가지
  • 은 피할 수
  • 코드의 이름에 대해 알고 필요가 없습니다

    • eval

    그러면 다음과 같이 표시됩니다.

    mappingDict = {"ClassName1" : MyPythonClass1, 
           "ClassName2" : MyPythonClass2, ... } 
    # keys are strings, values are classes 
    

    그런 다음이 값을 사용하여 조회를 수행합니다. 설정 파일 M : module 모듈입니다

    myClassName = types['extension1'] 
    myClass = mappingDict[myClassName] 
    
    0

    경우 classname 삶에 명명 된 클래스가 사용하는 클래스의 객체를 얻을 수

    class_ = getattr(module, classname) 
    

    (클래스의 주요 모듈에 거주하는 경우, import __main__를 사용 ,

    은 현재 모듈의 전역 범위에서 클래스를 찾으려면).이 모듈을위한 모듈 객체를 가져 사용하는

    class_ = globals()[classname] 
    

    Matt's answer과 같은 정적 사전은 더 나은 해결책이라고 생각합니다.

    관련 문제