带有内部输入的 Ruffus 管道

Ruffus pipeline with internal inputs

我想用 Python 的 Ruffus 包创建一个管道,但我正在为它最简单的概念而苦苦挣扎。两个任务应该一个接一个地执行。第二个任务取决于第一个任务的输出。在 Ruffus 文档中,所有内容都是为 import/export from/to 外部文件设计的。我想处理像字典这样的内部数据类型。

问题是@follows 不接受输入,@transform 不接受命令。我错过了什么吗?

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

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

最终,管道应该在 class 中组合一组函数,以便随时更新 class 对象。

您应该只在有 input/output 个文件 时使用 Ruffus 装饰器。例如,如果 task1 生成 file1.txt 并且这是生成 file2.txttask2 的输入,那么您可以编写如下管道:

@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