我有一个 Python 函数,其输出是一个生成器:
def main_function(x):
r = get_range()
for i in range(r):
yield x+i
我想重构这段代码(我已经简化了使用情况,但实际的计算可能会更复杂且更长。请参见下面的EDIT)。根据我的理解,为了保持功能不变,我应该做以下几点:
(a) 与原始代码具有相同的接口
def sub_function(x,r):
for i in range(r):
yield x+i
def main_function(x):
r = get_range()
return sub_function(x,r)
与其他方法相比:
(b) 这会返回一个生成器的生成器(这种方法有什么优势吗?)
def sub_function(x,r):
for i in range(r):
yield x+i
def main_function(x):
r = get_range()
yield sub_function(x,r)
(c) 这将违背生成器的设计初衷(这样说对吗?)
def sub_function(x,r):
return [x+i for i in range(r)]
def main_function(x):
r = get_range()
for i in sub_function(x,r):
yield(i)
编辑: 评论指出正确答案取决于使用情况。我想补充说明,我的使用情况是解析XML文件以提取字段并将它们写入数据库。这部分被委托给子函数(sub_function())。我也问了这个问题,以便更好地理解嵌套yield用于重构代码的用法。