Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态调用配置文件中定义的python类_Python - Fatal编程技术网

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

动态调用配置文件中定义的python类,python,Python,我有一个config.cfg,我使用python模块ConfigParser解析它。在一节中,我想配置fileextension:ClassName表单的赋值。在以下字典中解析结果: types = { "extension1" : "ClassName1", "extension2" : "ClassName2" } 编辑:我知道我现在可以做: 但是我被告知,eval是邪恶的,不应该被使用 您知道动态配置哪个文件扩展名生成哪个类的更好方法吗?如果配置文件中的类名与python代码中的

我有一个config.cfg,我使用python模块ConfigParser解析它。在一节中,我想配置
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]
我认为中的静态字典是更好的解决方案