2015-06-21 6 views
1

Одним из преимуществ процедурного программирования является возможность извлечь любую часть кода в функцию, которая может быть повторно использована во многих местах, что уменьшает дублирование кода. Однако оператор yield в Python, по-видимому, снижает эту способность, потому что когда оператор 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