在我的模块中,我有一些依赖于一个启动时间较长的外部模块的函数。 我如何使用LazyLoader
? 如果我有
import veggies
或者import veggies.brussels.sprouts
或者from veggies.brussels import sprouts
如何使用LazyLoader
替换这些语句,以便将模块中的内容延迟到需要时执行?从文档中并不容易看出如何使用它。没有例子,而且nullege代码搜索只能找到Python自带的单元测试。
在我的模块中,我有一些依赖于一个启动时间较长的外部模块的函数。 我如何使用LazyLoader
? 如果我有
import veggies
或者import veggies.brussels.sprouts
或者from veggies.brussels import sprouts
如何使用LazyLoader
替换这些语句,以便将模块中的内容延迟到需要时执行?从文档中并不容易看出如何使用它。没有例子,而且nullege代码搜索只能找到Python自带的单元测试。
原始问题中有些代码似乎是懒加载进行完整导入:
以下文件对两个模块进行了懒加载导入:
import sys
import importlib.util
def lazy(fullname):
try:
return sys.modules[fullname]
except KeyError:
spec = importlib.util.find_spec(fullname)
module = importlib.util.module_from_spec(spec)
loader = importlib.util.LazyLoader(spec.loader)
# Make module with proper locking and get it inserted into sys.modules.
loader.exec_module(module)
return module
os = lazy("os")
myown = lazy("myown")
print(os.name)
myown.test()
为进行测试,我在myown.py
中使用了以下内容。
print("Executed myown.")
def test():
print("OK")
那很好地运作了(Python 3.8a0)。
lib.py
print('Executing lib.py')
class MyClass():
def get_name(self):
return self.__class__.__name__
main.py
def lazy(fullname):
import sys
import importlib.util
try:
return sys.modules[fullname]
except KeyError:
spec = importlib.util.find_spec(fullname)
module = importlib.util.module_from_spec(spec)
loader = importlib.util.LazyLoader(spec.loader)
# Make module with proper locking and get it inserted into sys.modules.
loader.exec_module(module)
return module
def method1():
lib = lazy("lib")
my_class = lib.MyClass()
print(my_class.get_name())
def method2():
import lib
my_class = lib.MyClass()
print(my_class.get_name())
if __name__ == '__main__':
methods = [method1, method2]
for method in methods:
print('Executing {}'.format(method.__name__))
for _ in range(2):
method()
print('---------------------------------')
结果:
Executing method1
Executing lib.py
MyClass
Executing lib.py
MyClass
---------------------------------
Executing method2
Executing lib.py
MyClass
MyClass
---------------------------------
LadyLoader
的例子吗? - gerrit