在创建从中继承的对象时在Python中进行条件导入

我创建了一个连接到其他库的包( 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):
    ...
最直接,最容易理解的解决方案是将库拆分为子模块.

与尝试在对象初始化上进行导入相比,它有几个优点:

>用户知道会发生什么. import my_lib.keras很可能依赖于keras
>导入错误发生在导入期间,而不是在运行时
>通过不依赖于从未经插入的类继承的技巧,您可以避免许多潜在的问题
>只需更改import my_lib.keras以导入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
相关文章
相关标签/搜索