2015-06-21 53 views
1

过程编程的优点之一是能够将任意一段代码提取到一个函数中,该函数可以在许多地方重用,从而减少代码重复。但是,Python中的yield语句似乎减少了这种能力,因为当yield语句被提取到另一个函数中时,原始生成器函数变成正常函数,因此不能再用作生成器。Python中生成器函数中的代码重复

考虑这个例子:

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语句的代码?

+4

请提供一些例子证明你的问题。现在,你要问的东西还不清楚。 – MattDMo

+0

我不明白你在说什么。你是指[Coroutines](https://en.wikipedia.org/wiki/Coroutine)? –

回答

1

在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 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