我有以下功能:
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
我要做的是从文件中读取行,使用许多函数转换每行,然后对结果行执行某些操作。我不想一次读取所有行,因为文件非常大。
我的问题是我是否以正确的方式这样做。代码执行正确,但是我头脑中的程序执行感觉很复杂,我不知道我是否能在一个月左右的时间内处理这段代码。
所以我想知道的是:是否有某种编程模式显示如何正确地将生成器链接到彼此?
答案 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