如何编写一个好的生成器链接函数

时间:2017-11-20 14:19:15

标签: python generator

我有以下功能:

def read_data(file_location):
    for line in open(file_location):
        # pre-process the line  
        yield line

def transform_1(data):
    for line in data:
        # change line in some way
        yield line

def transform_2(data):
    for line in data:
        # change line in some other way
        yield line

def process_file(file_location):
    # Some description
    #
    # returns:
    #     generator
    data = read_data(file_location)
    data = transform_1(data)
    data = transform_2(data)
    return data

我要做的是从文件中读取行,使用许多函数转换每行,然后对结果行执行某些操作。我不想一次读取所有行,因为文件非常大。

我的问题是我是否以正确的方式这样做。代码执行正确,但是我头脑中的程序执行感觉很复杂,我不知道我是否能在一个月左右的时间内处理这段代码。

所以我想知道的是:是否有某种编程模式显示如何正确地将生成器链接到彼此?

2 个答案:

答案 0 :(得分:2)

假设每一行都以相同的方式进行转换,您可以将转换函数应用于每一行并使用生成器迭代所有行,我个人认为这更易读。

def transform_1(line):
    return line.replace(' ','') # example of transformation

def transform_2(line):
    return line.strip('#')

def process_file(file_location):
    with open(file_location) as in_f:
        for line in in_f:
            yield transform_2(transform_1(line))

根据变换的作用,它们可能会组合成一个单独的函数,但如果没有更多的上下文,很难知道。

答案 1 :(得分:1)

实际上,这样做得很好。我不确定为什么代码对你来说很复杂。关键是每个功能只做一件事只是一个加号。显然,函数名称应该反映正在进行的转换类型。像这样的代码是非常可测试和可维护的。如果您需要在六个月后对管道进行更改,您可能会感到惊讶的是,找到该部件比调整更改更容易。

我建议修改read_data生成器,如下所示:

def read_data(file_location):
    with open(file_location) as f:
        for line in f:
            yield line