Условный импорт в Python при создании наследуемого от него объекта - PullRequest
0 голосов
/ 28 декабря 2018

Я создаю пакет для подключения к другим библиотекам ( 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 голосов
/ 28 декабря 2018

Самое простое и понятное решение - разделить вашу библиотеку на подмодули.

Она имеет несколько преимуществ по сравнению с попытками импорта при инициализации объекта:

  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
...