我想实现一些类似于 django 夹具系统的东西,其中在夹具中设置model
属性,该属性指示夹具的模型类。它看起来像这样
my_app.models.my_model
我的问题是处理此类字符串以创建此“路径”指向的类的实例的标准方法是什么。我认为它应该看起来像:
- 将其拆分为模块名称和类名称部分
- 加载模块(如果未加载)
- 按名称从模块中获取类
- 实例化它
我应该怎么做?
编辑:我想出了一个肮脏的解决方案:
def _resolve_class(self, class_path):
tokens = class_path.split('.')
class_name = tokens[-1]
module_name = '.'.join(tokens[:-1])
exec "from %s import %s" % (module_name, class_name)
class_obj = locals()[class_name]
return class_obj
它的工作是肮脏的,但是由于使用 exec 和通过恶意准备夹具来操纵执行的可能性。应该如何正确完成?