importlib使用心得

虽然Python的import使用起来非常方便, 但有时候我们需要通过字符串来导入, 来实现灵活的导入. 特别是需要根据当前情况动态载入不同的类/方法的时候.

cookbook中, 可以看到一个经典的实现. 可以实现通过字符串来导入包
(package)或者模块(module), 但是我们有时候还需要导入类(class)或函数(function). importlib库的import_module函数并不能处理这种情况.

只能实现如下功能

1
2
3
4
5
6
7
8
9
# test1.py
def hello():
print("hello world!")
# test2.py
import importlib
test1 = importlib.import_module('test1')
test1.hello()

但如果想直接导入函数,如

1
2
3
4
# test3.py
from test1 import hello
hello()

就无法只通过importlib库实现了, 因为import_module只能导入module, 当然你可以试试, 会报错显示找不到module.

但我们可以曲线救国. 首先每个模块导入后是一个对象(object), 它里面的各个函数都是以属性(attr)的形式挂靠在里面, 所以我们可以使用getattr来找到制定的函数.

示例一:

1
2
3
4
5
# test4.py
import importlib
hello = getattr(importlib.import_module('test1'), 'hello')
hello()

等价于

1
2
3
4
# test3.py
from test1 import hello
hello()

示例二:

1
2
3
4
import importlib
ClassA = getattr(importlib.import_module('packege.module'), 'ClassA')
class_a = ClassA()

等价于

1
2
3
from packege.module import ClassA
class_a = ClassA()