У меня есть две функции func1 и func2, которые являются конкретными реализациями func0, которые дают его результат:

def func0(parameter, **kwargs):
    #do sth with kwargs and parameter
    yield result # result is html

Как я должен ссылаться на func0 внутри «определенных» функций, чтобы они давали свои результаты? Возврат нормально?

def func1(**kwargs):
    return func0(parameter=1, **kwargs)

def func2(**kwargs):
    return func0(parameter=2, **kwargs)
2
fanny 13 Янв 2017 в 13:02

4 ответа

Лучший ответ

Если вы используете return, то func1 вернет генератор func0. В качестве альтернативы, если вы используете yield from, то функция обтекания становится самим генератором, получая отдельные элементы из func0. Полученные элементы одинаковы в обоих случаях.

def func1(**kwargs):
    return func0(parameter=1, **kwargs)

def func2(**kwargs):
    yield from func0(parameter=1, **kwargs)

Обратите внимание, как func1 возвращает генератор func0, а func2 возвращает генератор func2.

>>> func1()
<generator object func0 at 0x7fe038147ea0>
>>> func2()
<generator object func2 at 0x7fe038147ee8>
>>> list(func1()) == list(func2())
True

Обратите внимание, что yield from был введен в Python 3. В Python 2 вы можете достичь того же самого, уступив из цикла.

def func2(**kwargs):
    for x in func0(parameter=1, **kwargs):
        yield x
1
tobias_k 13 Янв 2017 в 10:24

Вы возвращаете генераторы из функций. Вы должны прочитать о генераторе, это не долго, в любом случае вот способ использовать его:

gen = func1(args...)
res = gen.next()  # python 2

Или res = next (gen) # python 2 и 3

0
Israel Unterman 13 Янв 2017 в 10:14

Вот как я бы это сделал:

def func0(a):
    yield a**2

from functools import partial

func1 = partial(func0, a=1)
func2 = partial(func0, a=10)
print(next(func1()))  # prints 1
print(next(func2()))  # prints 100

Вы можете посмотреть partial там. , Как я уже сказал в комментариях, он по сути клонирует вашу функцию с некоторыми уже заданными необходимыми параметрами.


Поэтому, если func0 выход , то же самое делают и его частичные func1 и func2.

1
Ev. Kounis 13 Янв 2017 в 10:20

В Python 3.3+ нормальным способом было бы использовать yield from. Из документации:

PEP 380 добавляет выход из выражения, позволяя генератору делегировать часть своих операций другому генератору. Это позволяет разделить код, содержащий yield, и выложить его в другой генератор. Кроме того, субгенератору разрешено возвращать со значением, и это значение становится доступным для делегирующего генератора.

Однако для Python 2.7 это невозможно. Вот альтернатива, которая работает вместо:

def base_squared_generator(parameter):
    yield parameter ** 2


def two_squared_generator():
    yield next(base_squared_generator(parameter=2))


def three_squared_generator():
    yield next(base_squared_generator(parameter=3))


print(next(two_squared_generator()))
print(next(three_squared_generator()))

< Сильный > Выход

4
9
3
Tagc 13 Янв 2017 в 10:14