Организация файлов при использовании конвейера Luigi?

#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 для большей гибкости при импорте классов и доступе к ним.