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

Pio*_*dal 5 python inheritance class python-import

我创建了一个连接到其他库(livelossplot)的包.它有很多可选的依赖项(深度学习框架),我不想强​​迫人们安装它们.

现在我使用条件导入,本着以下精神:

try:
    from .keras_plot import PlotLossesKeras
except ImportError:
    # import keras plot only if there is keras
    pass
Run Code Online (Sandbox Code Playgroud)

但是,这意味着它会导入大型库,即使不打算使用它们也是如此.问题是:只有在创建特定对象时才能导入库?

对于Python函数,它很简单:

def function_using_keras():
   import keras
   ...
Run Code Online (Sandbox Code Playgroud)

从其他类继承的类有什么好的做法?

在定义对象之前,似乎需要导入父类:

from keras.callbacks import Callback
class PlotLossesKeras(Callback):
    ...
Run Code Online (Sandbox Code Playgroud)

Nil*_*ner 4

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

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

  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
Run Code Online (Sandbox Code Playgroud)

进而

# mylib/keras.py
import keras

class PlotLosses():
    pass
Run Code Online (Sandbox Code Playgroud)

# mylib/tensorflow.py
import tensorflow

class PlotLosses():
    pass
Run Code Online (Sandbox Code Playgroud)