动态调用配置文件中定义的python类
我有一个config.cfg,我使用python模块ConfigParser解析它。在一节中,我想配置动态调用配置文件中定义的python类,python,Python,我有一个config.cfg,我使用python模块ConfigParser解析它。在一节中,我想配置fileextension:ClassName表单的赋值。在以下字典中解析结果: types = { "extension1" : "ClassName1", "extension2" : "ClassName2" } 编辑:我知道我现在可以做: 但是我被告知,eval是邪恶的,不应该被使用 您知道动态配置哪个文件扩展名生成哪个类的更好方法吗?如果配置文件中的类名与python代码中的
fileextension:ClassName
表单的赋值。在以下字典中解析结果:
types = {
"extension1" : "ClassName1",
"extension2" : "ClassName2"
}
编辑:我知道我现在可以做:
但是我被告知,eval
是邪恶的,不应该被使用
您知道动态配置哪个文件扩展名生成哪个类的更好方法吗?如果配置文件中的类名与python代码中的类名完全匹配(如果类在范围内!),您可以使用
eval
,但是。。。。。eval是邪恶的(一个巧合,只有一个字母不同?我认为不是!)
更安全的方法是添加一个额外的字典,将配置类名映射到python类名。我这样做是因为:
- 配置文件不必知道代码的名称
- 可以在不更改代码的情况下更改配置文件,反之亦然
- 它避免了
eval
mappingDict = {"ClassName1" : MyPythonClass1,
"ClassName2" : MyPythonClass2, ... }
# keys are strings, values are classes
然后使用配置文件中的值执行查找:
myClassName = types['extension1']
myClass = mappingDict[myClassName]
如果配置文件中的类名与python代码中的类名完全匹配(如果类在范围内!),则可以使用
eval
,但是。。。。。eval是邪恶的(一个巧合,只有一个字母不同?我认为不是!)
更安全的方法是添加一个额外的字典,将配置类名映射到python类名。我这样做是因为:
- 配置文件不必知道代码的名称
- 可以在不更改代码的情况下更改配置文件,反之亦然
- 它避免了
eval
mappingDict = {"ClassName1" : MyPythonClass1,
"ClassName2" : MyPythonClass2, ... }
# keys are strings, values are classes
然后使用配置文件中的值执行查找:
myClassName = types['extension1']
myClass = mappingDict[myClassName]
如果
module
是名为classname
的类所在的模块,则可以使用
class_ = getattr(module, classname)
(如果类位于主模块中,请使用import\uuuuu main\uuuu
获取此模块的模块对象。)
要在当前模块的全局作用域中查找该类,请使用
class_ = globals()[classname]
我认为中的静态字典是更好的解决方案。如果
module
是名为classname
的类所在的模块,则可以使用
class_ = getattr(module, classname)
(如果类位于主模块中,请使用import\uuuuu main\uuuu
获取此模块的模块对象。)
要在当前模块的全局作用域中查找该类,请使用
class_ = globals()[classname]
我认为中的静态字典是更好的解决方案