背景
在django项目的开发中遇到了一种情况:得到了一个模块的字符串表示形式,如何将其导入并执行其中的方法或者函数呢?
解决方法
百度了之后发现了可以使用importlib模块,导入字符串类型的内置模块、文件,或者自定义的模块,相当于导入了该模块,之后就可以通过反射(getattr)调用模块内的属性或者方法。我们就以time模块为例进行说明吧。
>>> import importlib
>>> dir(importlib)
['_RELOADING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__import__', '__loader__', '__name__', '
__package__', '__path__', '__spec__', '_bootstrap', '_bootstrap_external', '_imp', '_r_long', '_w_long', 'abc', 'find_lo
ader', 'import_module', 'invalidate_caches', 'machinery', 'reload', 'sys', 'types', 'util', 'warnings']
>>> obj = importlib.import_module('random')
>>> type(obj)
<class 'module'>
>>> getattr(obj, 'randint')(1,3)
2
>>> getattr(obj, 'randint')(1,3)
3
>>> getattr(obj, 'sample')([1, 2, 3, 4, 5], 3)
[5, 1, 3]
>>>
|