【发布时间】:2011-08-22 08:41:27
【问题描述】:
我正在研究各种编程语言的协程和生成器。
我想知道是否有一种更简洁的方法可以将通过生成器实现的两个协程组合在一起,而不是在被调用者产生的任何情况下返回给调用者?
假设我们使用以下约定:除最后一个之外的所有 yield 返回 null,而最后一个返回协程的结果。因此,例如,我们可以有一个调用另一个协程:
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 返回其最终结果,然后将其分配给 x 允许 B 继续。
我怀疑实际的代码应该显式地迭代 A 这样:
def B():
# do something that may or may not yield
for x in A(): ()
# ...
return result
这有点丑陋且容易出错......
PS:这是一个游戏,语言的用户将是编写脚本的设计师(脚本=协程)。每个字符都有一个关联的脚本,并且有许多子脚本被主脚本调用;考虑一下,例如,run_ship 多次调用reach_closest_enemy、fight_with_closest_enemy、flee_to_allies 等等。所有这些子脚本都需要按照您上面描述的方式调用;对于开发人员来说这不是问题,但对于设计师来说,他们必须编写的代码越少越好!
【问题讨论】:
-
我认为这些示例清楚地表明了惯用语。由于我无法理解这些示例有什么问题,您能否说明您发现哪些示例不清楚?哪些例子令人困惑?您能否更具体地说明所有那些无法显示惯用 Python 的示例?
-
我已经准确地阅读了这些文章,PEP-342 让我有些困惑:它是当前在 Python 中工作的一些实际扩展吗? Trampoline 类是否是该语言标准库的一部分?顺便说一句,我的问题非常准确,它是关于通过协程控制的惯用方式。我可以阅读大量的方法来做到这一点,这一事实确实无济于事。你的狡猾也不...
-
惯用语是关于执行某些功能的“标准”方式;迭代嵌套协程的结果绝对没有错,但是在编程语言文献中有一些示例,其中 yield 会自动爬下调用堆栈,因此您不需要在每个调用者处重新屈服,因此我很好奇如果这种模式是否被 Python 中的语法糖所覆盖!
-
@Giuseppe Maggiore:“产生自动爬下调用堆栈的编程语言”这听起来不像是同一个问题。您是在要求惯用的 Python(如许多示例所示),还是要求在 Python 示例中未显示但在其他语言中显示的其他功能?恐怕我根本无法理解你的问题。你能澄清一下你真正在寻找什么吗?
-
您可能想看看“惯用语”是什么意思,因为我感觉这就是我们遇到问题的地方 (thefreedictionary.com/idiomatic)。我知道我可以在 Python 中构建协程。我知道如何使用生成器来做到这一点。我想知道(A)是否有一种公认的“正确方法”可以这样做,它可能使用一些语法糖或其他技术,或者(B)如果没有建议并且任何可行的方法都是可以接受的。 (A) 是我所说的惯用语。相比之下,使用具有大量可变引用的函数式语言编写不会是惯用的。干杯
标签: python generator coroutine