#python #class #dependencies #workflow #luigi
#python #класс #зависимости #рабочий процесс #luigi
Вопрос:
Я использую Luigi для своего рабочего процесса. Мой рабочий процесс разделен на три основные части — импорт, анализ, экспорт. Внутри каждой части существует несколько задач Luigi.
У меня могло бы быть все в одном файле. Но если я хочу сохранить все отдельно, как при наличии data_import.py
, analysis.py
и export.py
.
Например, если data_import.py
выглядит как:
import luigi
class import_task_A(luigi.Task):
def requires(self):
return []
def output(self):
return luigi.LocalTarget('myfile.txt')
def run(self):
my import stuff
if __name__ == '__main__':
luigi.run()
Но что, если задача в export.py зависит от задачи в import.py . Сделал бы я:
from data_import import import_task_A
import luigi
class export_task_A(luigi.Task):
def requires(self):
return import_task_A()
def output(self):
return luigi.LocalTarget('myfile.txt')
def run(self):
my import stuff
if __name__ == '__main__':
luigi.run()
Если у меня есть более крупные проекты, разбитые на несколько .py
файлов, каков наилучший способ сообщить Luigi, какие требуемые задачи находятся в каком файле? Похоже, этот метод стал бы громоздким.
Комментарии:
1. То, как вы это делаете, кажется прекрасным.
2. Почему это стало бы громоздким?
Ответ №1:
Почему это стало бы громоздким? Если ваш export_task_A зависит от многих задач, ваши требования к def изменятся на:
def requires(self):
return [import_task_A(), import_task_B()]
Кстати, в этом случае вы можете захотеть удалить
if __name__ == '__main__':
luigi.run()
из вашего data_import.py . Также вместо того же в data_export.py использовать
if __name__ == '__main__':
luigi.build([export_task_A()])
Ответ №2:
Не уверен, что есть способ обойти это. Вам нужно либо иметь много файлов, либо много классов в одном файле. Это вопрос предпочтений, как вы хотели бы организовать свой проект.
Одна вещь, которую вы могли бы сделать, чтобы ограничить количество местоположений, из которых вы импортируете, — это иметь один файл python, который импортирует все необходимые классы Luigi
# my_tasks.py
from data_import import import_task_A
from export import export_task_A
Затем в другие файлы вы можете импортировать все, что вам нужно из my_tasks
. Также рассмотрите возможность использования getattr
или importlib
для большей гибкости при импорте классов и доступе к ним.