2011-11-12 61 views
0

我有一個config.cfg,我使用python模塊ConfigParser解析。在一節中,我想配置形式fileextension : ClassName的分配。分析結果如下解釋:動態調用配置文件中定義的python類

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

編輯:我知道我現在可以做的:

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

但我。據瞭解,eval是邪惡的,不應該被使用。

你知道一個更好的方式來動態配置哪個文件擴展名導致哪個類嗎?

回答

3

你可以使用eval,如果在配置文件中的類名完全在你的Python代碼的類名相匹配(如果類是在範圍上!),但是..... EVAL是(巧合的是,只有一個字母的差別呢?我看未必!)


一個更安全的方式做到這一點是添加從配置類名映射到Python類名的額外的字典。我這樣做是因爲:

  • 配置文件不必知道你的代碼的名字
  • 可以更改配置文件不改變代碼,反之亦然
  • 它避免了eval

所以它看起來像這樣:

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

然後,您執行查找使用價值fro米配置文件:

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

如果module是模塊命名classname生活中的類,你可以使用類對象

class_ = getattr(module, classname) 

(如果類生活在主模塊中,使用import __main__得到一個模塊對象爲這個模塊。)

要查找當前模塊的全局範圍內類,使用

class_ = globals()[classname] 

我覺得像Matt's answer這樣的靜態字典是更好的解決方案。