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

时间:2018-12-28 12:38:10

标签: python class inheritance python-import

我创建了一个连接到其他库(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):
    ...

1 个答案:

答案 0 :(得分:3)

最直接,最容易理解的解决方案是将您的库拆分为子模块。

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

  1. 用户知道会发生什么。 import my_lib.keras很可能依赖keras
  2. 导入错误发生在导入过程中,而不是在运行时发生
  3. 通过不依靠技巧从未导入的类继承来避免很多潜在的问题
  4. 最终用户只需将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