我创建了一个连接到其他库(livelossplot)的程序包。它有很多可选的依赖项(深度学习框架),我不想强迫人们安装它们。
现在,我本着以下精神使用条件导入:
try:
from .keras_plot import PlotLossesKeras
except ImportError:
# import keras plot only if there is keras
pass
但是,这意味着即使不打算使用大型库,它也会导入大型库。问题是:如何仅在创建一个特定对象时才导入库?
对于Python函数,这很简单:
def function_using_keras():
import keras
...
从其他类继承的类有什么好的做法?
似乎在定义对象之前需要导入父类:
from keras.callbacks import Callback
class PlotLossesKeras(Callback):
...
答案 0 :(得分:3)
最直接,最容易理解的解决方案是将您的库拆分为子模块。
与尝试在对象初始化上进行导入相比,它具有几个优点:
import my_lib.keras
很可能依赖keras
import my_lib.keras
更改为import my_lib.tensorflow
即可非常轻松地在实现之间进行切换这种解决方案可能看起来像
# mylib/__init__.py
class SomethingGeneric():
pass
def something_else():
pass
然后
# mylib/keras.py
import keras
class PlotLosses():
pass
和
# mylib/tensorflow.py
import tensorflow
class PlotLosses():
pass