Долгое время я не знал, что вы не можете поставить return
перед оператором доходности. Но на самом деле вы можете:Когда использовать return (yield что-то)?
def gen():
return (yield 42)
, который похож на
def gen():
yield 42
return
И единственное, использование я могу думать о том, чтобы прикрепить отправленное значение StopIteration
: pep-0380
возвращение выражение в генератор вызывает остановку StopExteration (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)
это просто синтаксический сахар. Я что-то упускаю?
«Но это может быть сделано с использованием дополнительной переменной, которая более ясна» - вы можете сказать это о любом операторе 'return'. 'return x + y' становится' z = x + y; возврат z'.'return foo()' становится 'x = foo(); return x'. Здесь нет ничего конкретного: «return (yield any)» здесь. – user2357112
Что касается аргументов 'StopIteration', вы не должны явно обращаться к ним; это то, как реализуются значения выражения «yield from». Это опубликованная часть API, но обычно это не интересная часть. – user2357112