动态调用配置文件中定义的python-class

flo*_*sch 2 python

我有一个 config.cfg,我使用 python 模块 ConfigParser 对其进行解析。在一节中,我想配置表单的分配fileextension : ClassName。在以下字典中解析结果:

types = {
  "extension1" : "ClassName1",
  "extension2" : "ClassName2"
}
Run Code Online (Sandbox Code Playgroud)

编辑:我知道我现在可以这样做:

class_ = eval(types[extension])
foo = class()
Run Code Online (Sandbox Code Playgroud)

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

您知道动态配置哪个文件扩展名导致哪个类的更好方法吗?

Mat*_*ick 5

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


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

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

所以它看起来像:

mappingDict = {"ClassName1" : MyPythonClass1, 
               "ClassName2" : MyPythonClass2, ... }
# keys are strings, values are classes
Run Code Online (Sandbox Code Playgroud)

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

myClassName = types['extension1']
myClass = mappingDict[myClassName]
Run Code Online (Sandbox Code Playgroud)