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
过程式编程的一个优点是能够将任何代码提取到一个函数中,它可以在许多地方重用,减少代码重复。然而,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