У меня есть пара классов загрузки данных для импорт данных из документа Excel с несколькими листами. Каждый из листов настраивается, поэтому имя листа и имена отдельных столбцов могут меняться (но для них есть значения по умолчанию, определенные в атрибутах класса).
Между двумя листами существуют и другие ссылки между классами. рассматриваемые классы, но я решил, что этот пример был наиболее простым:
Одной из особенностей отдельного сценария экспорта является использование метаданных загрузчиков для заполнения шаблона Excel (с несколько листов). В этом шаблоне есть комментарии к заголовкам столбцов на каждом листе, которые ссылаются на другие листы, поскольку содержимое некоторых листов используется для заполнения раскрывающихся списков на других листах.
Таким образом, комментарий в заголовке в на одном листе может быть написано: «Данные раскрывающегося списка этого столбца заполнены содержимым столбца X на листе 2». А в заголовке столбца X листа 2 будет комментарий: «Содержимое этого столбца используется для заполнения раскрывающихся списков для столбца Y на листе 1».
Я пошел дальше и добавил соответствующий импорт, зная, что В конечном итоге у меня возникла проблема с циклическим импортом, но я решил, что мне нужно концептуально определить, что я хочу сделать, а затем попытаться решить проблему импорта.
Вот небольшой игрушечный код. попытаться свести это к минимуму:
Код: Выделить всё
infusates_loader.py
Код: Выделить всё
from DataRepo.loaders.tracers_loader import TracersLoader
class InfusatesLoader(TableLoader):
DataColumnMetadata = DataTableHeaders(
TRACERNAME=TableColumn.init_flat(
...
source_sheet=TracersLoader.DataSheetName,
source_column=TracersLoader.DataHeaders.NAME,
),
)
Код: Выделить всё
tracers_loader.py
Код: Выделить всё
from DataRepo.loaders.infusates_loader import InfusatesLoader
class TracersLoader(TableLoader):
DataColumnMetadata = DataTableHeaders(
NAME=TableColumn.init_flat(
...
# Cannot reference the InfusatesLoader here (to include the name of its
# sheet and its tracer name column) due to circular import
target_sheet=InfusatesLoader.DataSheetName,
source_column=InfusatesLoader.DataHeaders.TRACERNAME,
),
)
Многие вопросы по циклическому импорту связаны с методами, поэтому я не думаю, что они применимы к атрибутам класса? Я пробовал использовать importlib и пытался выполнить импорт внутри функции, но как только он попытался настроить класс, я получил ошибку импорта.
Подробнее здесь: https://stackoverflow.com/questions/784 ... ne-another