Что означает выражение "a = yield from f()"?

Итак, вот выражение Python:

a = yield from f()

Что это значит? Где это можно использовать? Какой объект должен f быть? Какова будет ценность a после выражения оценивается?

Здесь есть несколько вопросов о стекловом потоке о питоне yield а также yield from но я не нашел ответа на это.

Я понимаю смысл yield x, y = yield а также y = yield x, Четное yield from f() более или менее понятно. Но a = yield from f() это что-то неожиданное для меня.

ОБНОВИТЬ:

Б. Барбьери дал правильный ответ. И все же мне нужно сформулировать это немного по-другому.

Семантика выражения a = yield from f() очень похоже на вызов функции: значение a будет что f() возвращается. Но если f() дает что угодно, полученное значение будет перенаправлено на "верхний уровень" (вы можете только написать a = yield from f() внутри функции, и это заставит вас функционировать генератор). Если после этого "верхний уровень" отправляет значение обратно в ваш генератор, оно будет переадресовано f() и f() будет продолжать.

yield from позволяет f() и "верхний уровень" для общения во время работы вашей функции.

Я думаю, теперь я понимаю, что это yield from все, и надеюсь, что это объяснение будет полезно для других.

2 ответа

Вот очень простой пример (yield from может использоваться только внутри функции)

def f():
    for i in range(2):
        yield i
    return 3

def g():
    a = yield from f()
    print('a = {}'.format(a))

for item in g():
    print(item)

# output:
# 0
# 1
# a = 3

a присваивается значение функции f()returns. генератор g дает все промежуточные результаты.

  • f должен быть генератором (то, что yieldс).
  • a будет просто задано возвращаемое значение f()

Согласно документации:

  • f должен быть генератор (что неудивительно)
  • f должен вернуться (и не только уступить)
  • f следует принять значение от send с помощью some_var = yield
  • a получит значение, возвращаемое f

Вот f пример:

def f():
    while 1:
        x = yield
        if next is None:
            return "something"
        do_something_with_recieved_value(x)

Учитывая генератор g:

l = []
def g():
    while True:
        a = yield from f()
        l.append(a)
  • всякий раз, когда f возвращается, возвращенное значение помещается в l
  • каждое значение отправить g с помощью send будет перенаправлен f

Примечание: вам нужно запустить генератор, прежде чем send это что-то.

o = g()
next(o)  # Ensure the accumulator is ready to accept values

Я не проверял все, не стесняйтесь комментировать, если что-то неясно.

Другие вопросы по тегам