我有一个config.cfg,我使用python-module ConfigParser解析它。在一节中,我想配置表单fileextension : ClassName
的分配。解析结果如下:
types = {
"extension1" : "ClassName1",
"extension2" : "ClassName2"
}
编辑:我知道我现在可以做到:
class_ = eval(types[extension])
foo = class()
但我明白eval
是邪恶的,不应该被使用。
您是否知道一种更好的方法来动态配置哪个文件扩展名导致哪个类?
答案 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中的静态字典是更好的解决方案。