У меня проблема с управлением импортом с помощью большого репозитория, который у нас есть. Для ясности давайте представим, что репо выглядит примерно так:
repo/
__init__.py
utils/
__init__.py
math.py
readers.py
...
...
Теперь наши __init__.py
файлы настроены так, что мы можем сделать что-то вроде этого
from repo.utils import IniReader
В этом примере repo/utils/__init__.py
будет иметь
from .readers import IniReader, DatReader
Эта структура хорошо сработала для нас с точки зрения читабельности, но сейчас мы сталкиваемся с проблемами при попытке развертывания приложений.
Проблема в том, что ... давайте представим, что я пишу приложение, которое выглядит следующим образом:
from repo.utils import IniReader
if __name__ == '__main__':
r = IniReader('blah.ini')
print(r.fields)
Теперь from repo.utils import IniReader
выполнит repo/utils/__init__.py
, который в этом случае будет импортировать IniReader
и DatReader
. Давайте представим, что DatReader
выглядит примерно так:
import numpy as np
import scipy
import tensorflow
from .math import transform
class DatReader():
...
, который соответствует PEP8, со всеми импортами в верхней части файла.
Проблема здесь в том, что DatReader
требует некоторого тяжеловесного импорта (например, numpy, scipy, tenorflow - огромные библиотеки). Что еще хуже, from .math import transform
может иметь что-то вроде from repo.contrib import lookup
, которое затем попадает в repo/contrib/__init__.py
, который запускает цепную реакцию и в итоге импортирует весь наш репозиторий.
Это действительно не было проблемой для всех нас, разработчиков, когда полная среда разработки встала, но теперь, когда мы пытаемся поставлять приложения (внутренне), этот адский импорт становится проблемой .
Есть ли стандартное решение этой проблемы? Мы говорили о том, чтобы просто оставить __init__.py
пустым или просто не иметь всех импортируемых файлов в начале файла, как указано в PEP8. Оба эти решения идут с компромиссами, поэтому, если у кого-то есть предложения или рекомендации, я бы хотел их услышать.
Спасибо!