动态调用config-file中定义的python-class

时间:2011-11-12 15:53:38

标签: python

我有一个config.cfg,我使用python-module ConfigParser解析它。在一节中,我想配置表单fileextension : ClassName的分配。解析结果如下:

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

编辑:我知道我现在可以做到:

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

但我明白eval是邪恶的,不应该被使用。

您是否知道一种更好的方法来动态配置哪个文件扩展名导致哪个类?

2 个答案:

答案 0 :(得分:4)

如果配置文件中的类名与python代码中的类名完全匹配(如果类在范围内!),则可以使用eval,但是..... eval是邪恶(巧合的是,只有一个字母差异?我想不是!)


更安全的方法是添加一个额外的字典,从配置类名映射到python类名。我这样做是因为:

  • 配置文件不必知道您的代码名称
  • 可以在不更改代码的情况下更改配置文件,反之亦然
  • 避免eval

所以它看起来像是:

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

然后使用配置文件中的值执行查找:

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

答案 1 :(得分:0)

如果module是名为classname的类所在的模块,则可以使用

获取类对象
class_ = getattr(module, classname)

(如果该类位于主模块中,请使用import __main__获取此模块的模块对象。)

要在当前模块的全局范围内查找该类,请使用

class_ = globals()[classname]

我认为Matt's answer中的静态字典是更好的解决方案。