Python 中生成器函数中的代码重复

Code duplication in generator functions in Python

过程式编程的一个优点是能够将任何代码提取到一个函数中,它可以在许多地方重用,减少代码重复。然而,Python中的yield语句似乎降低了这种能力,因为当yield语句被提取到另一个函数中时,原来的生成器函数就变成了一个普通的生成器函数,因此不能用作不再是发电机。

考虑这个例子:

def foo():
  do_something()
  bar = get_some_value()
  yield bar
  save(bar)
  do_something_else()
  # more code in between
  bar = get_some_value()
  yield bar
  save(bar)
  # finishing up

请注意,yield 语句周围的代码始终相同,但我们无法将其提取为函数。

这是 Python 的已知缺陷,还是有解决方法可以重用 yield 语句周围的代码?

在 Python 3.3 或更高版本中:

def helper():
    bar = get_some_value()
    yield bar
    save(bar)

def foo():
  do_something()
  yield from helper()
  do_something_else()
  # more code in between
  yield from helper()
  # finishing up

早前Python秒(包括Python 2):

def helper():
    bar = get_some_value()
    yield bar
    save(bar)

def foo():
  do_something()
  for x in helper(): yield x
  do_something_else()
  # more code in between
  for x in helper(): yield x
  # finishing up