Долгое время я не знал, что вы не можете поставить return
перед оператором yield. Но на самом деле вы можете:
def gen():
return (yield 42)
который похож на
def gen():
yield 42
return
И единственное, что я могу придумать, это прикрепить отправленное значение к StopIteration
: pep-0380
return expr в генераторе вызывает остановку StopIteration (expr) при выходе из генератора.
def gen():
return (yield 42)
g = gen()
print(next(g)) # 42
try:
g.send('AAAA')
except StopIteration as e:
print(e.value) # 'AAAA'
Но это можно сделать и с помощью дополнительной переменной, которая более явная:
def gen():
a = yield 42
return a
g = gen()
print(next(g))
try:
g.send('AAAA')
except StopIteration as e:
print(e.value) # 'AAAA'
Итак, кажется, что return (yield xxx)
- это просто синтаксический сахар. Я что-то пропустил?