Трубопровод Ruffus с внутренними входами

Я хотел бы создать конвейер с пакетом Ruffus для Python, и я борюсь с его простейшими концепциями. Две задачи должны быть выполнены одна за другой. Второе задание зависит от выхода первого задания. В документации Ruffus все предназначено для импорта / экспорта из / во внешние файлы. Я хотел бы обрабатывать внутренние типы данных, как словари.

Проблема в том, что @follows не принимает входных данных, а @transform не принимает диктовок. Я что-то пропустил?

def task1():
    # generate dict
    properties = {'status': 'original'}
    return properties

@follows(task1)
def task2(properties):
    # update dict
    properties['status'] = 'updated'
    return properties

В конечном итоге конвейер должен объединить в классе набор функций, которые обновляют объект класса на ходу.

1 ответ

Решение

Вы должны использовать декораторы Ruffus только при наличии файлов ввода / вывода. Например, если task1 генерирует file1.txt и это вход для task2, который генерирует file2.txt тогда вы могли бы написать конвейер следующим образом:

@originate('file1.txt')
def task1(output):
    with open(output,'w') as out_file:
        # write stuff to out_file

@follows(task1)
@transform(task1, suffix('1.txt'),'2.txt')
def task2(input_,output):
    with open(input_) as in_file, open(output,'w') as out_file:
        # read stuff from in_file and write stuff to out_file

Если вы просто хотите использовать словарь в качестве входных данных, вам не нужен Ruffus, вы можете просто упорядочить код соответствующим образом (так как он будет выполняться последовательно) или вызвать task1 в task2:

def task1():
    properties = {'status': 'original'}
    return properties

def task2():
    properties = task1()
    properties['status'] = 'updated'
    return properties
Другие вопросы по тегам