使用pyforest既可以简化python导入模块的过程, 又能够支持模块的惰性导入, 它内置了很多数据科学模块,此外还支持开发人员自定义所需要加载的模块
python简便性依赖于丰富的第三方库,因此,你看到的许多脚本里,在文件的最开始的十几行代码都是在导入所需要的库,尤其是在数据科学领域,你看到的代码可能是下面的样子
import pandas as pd
import statistics
import numpy as np
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
面对这样的代码,时间久了难免会不胜其烦,那么有没有什么办法可以免去这些无聊的导入过程呢?
最简单,最粗暴的做法就是编写一个专门的导入脚本,可以将其命名为moudle_import.py, 将所需要的库在这里导入,之后在编写其他脚本时,就可以直接从这个脚本里导入
from moudle_import import *
如此,再也无需在脚本的最上方写一大堆的import了,但这样做有一个弊端,其他脚本里,未必需要所有的第三方库,有什么办法可以支持惰性导入呢?
所谓惰性导入,就是只有当这个库被使用时才会导入,听起来很神奇是不是,pyforest 就是这样一个支持惰性导入的库,它的安装非常方便
pip install pyforest
使用pyforest,你既可以省去大量的import操作,又能够做到惰性导入,下面是一份示例代码
from pyforest import *
df = pd.DataFrame()
print(df)
active_imports() # 输出导入的模块
在代码里,我并没有使用常规的import语句导入pandas模块
import pandas as pd
但直接使用pd, 却没有任何错误, 这说明已经从pyforest 中导入了pandas并将其命名为pd,进入到pyforest 模块一探究竟,发现所有的模块都是通过下面这行代码导入的
from ._imports import *
看来所有的奥秘都藏在_imports.py文件中,进入到这个文件以后,终于真相大白, 在这个脚本里,它已经将常用的数据科学库使用惰性加载的方式定义
pd = LazyImport("import pandas as pd")
np = LazyImport("import numpy as np")
dd = LazyImport("from dask import dataframe as dd")
只有在执行pd.DataFrame() 这条语句时,pandas模块才会真正的被导入,这其中的原理有是怎么回事呢?关键在于LazyImport这个类重载了__getattr__ 方法和__call__。
当我们通过 . 来访问一个对象的属性时,本质上是在调用__getattr__方法, 而在该方法里,调用了LazyImport的__maybe_import__ 方法来实现真正的导入操作, 这正是惰性导入的关键,只有真正使用时,才导入, 而之所以还要实现__call__方法,原因在于对于某些模块的使用可能会是直接调用的方式,比如Path
from pathlib import Path
Path(".")
如果你希望被自动加载的模块并不存在于_imports.py文件中,可以在pyforest的安装目录里新增一个user_imports.py文件,在这里增加你想导入的模块,pyforest会自动加载
QQ交流群: 211426309