Генераторы и сопрограммы Python

Я изучаю сопрограммы и генераторы на разных языках программирования.

Мне было интересно, есть ли более чистый способ объединить вместе две сопрограммы, реализованные с помощью генераторов, чем возвращать вызывающему объекту все, что дает вызываемый?

Допустим, мы используем следующее соглашение: все результаты, кроме последнего, возвращают ноль, а последний возвращает результат сопрограмма. Так, например, у нас может быть сопрограмма, которая вызывает другую:

def A():
  # yield until a certain condition is met
  yield result

def B():
  # do something that may or may not yield
  x = bind(A())
  # ...
  return result

в этом случае я хочу, чтобы через привязку (которая может быть или не может быть реализована, вот в чем вопрос) сопрограмма B дает результат всякий раз, когда A дает результат, пока A не вернет свое окончательное result, который затем присваивается x, позволяя B продолжить.

Я подозреваю, что реальный код должен явно повторять A так:

def B():
  # do something that may or may not yield
  for x in A(): ()
  # ...
  return result

что немного уродливо и подвержено ошибкам ...

PS: это для игры, в которой пользователями языка будут дизайнеры, которые пишут скрипты (скрипт = сопрограмма). У каждого персонажа есть связанный сценарий, и есть много дополнительных сценариев, которые вызываются основным сценарием; учтите, что, например, run_ship многократно вызывает rich_closest_enemy, fight_with_closest_enemy, flee_to_allies и так далее. Все эти подпрограммы необходимо запускать так, как вы описали выше; для разработчика это не проблема, но для дизайнера, чем меньше кода нужно написать, тем лучше!

9
задан Giuseppe Maggiore 12 May 2011 в 07:18
поделиться