【发布时间】:2016-03-10 03:18:56
【问题描述】:
我想知道在 Python 3 中编写协程的最佳实践是什么。我正在开发应该接受一些输入的基本方法(使用 .send() 方法),对此输入执行计算,然后产生输出。
我发现的第一种方法基本上是执行以下操作:
def coroutine(func):
data = yield
while 1:
data = yield func(data)
这似乎可行,但循环中的那条线让我心烦意乱。它似乎首先产生一个函数,然后然后接受输入并在恢复之后执行分配。这对我来说完全不直观。
我正在研究的另一种方法是:
def coroutine():
while 1:
data = yield
[ do stuff with data here ... ]
yield result
这段代码对我来说更容易理解,它还让我可以将代码直接放入生成器中,而不是传入函数。但是用起来很烦。每个对生成器的实际调用(如“gen.send(2)”)都必须后跟一个“gen.send(None)”,以将生成器推进到下一个产量。
在我看来,这里的问题源于“yield”关键字被用于两个不同的事情:返回语句和输入语句。
如果可能的话,我想要一种方法,让我接受输入,对该输入进行计算,然后产生输出,而不必像第一种方法那样传递函数和使用单行,或者不必发送无关值作为在第二种方法中。我该怎么做?
请注意:实际上,我将发送多个值。所以有多余的“g.send(None)”语句的问题变得更糟了。
【问题讨论】:
-
在我看来,您的 both 示例都涉及传入一个函数。此外,您可能想进一步解释为什么要为此使用生成器。您的示例非常基本,以至于它们没有说明使用生成器的任何理由,而不仅仅是让调用者在循环中调用
func本身。另外,如果第一个示例已经对您有用,您的实际问题是什么? -
@BrenBarn 我编辑了问题以强调第二种方法不需要传入的函数,这正是我想要的。我的问题是:如何以第二种方法的方式使用生成函数,而不必不断发送“无”对象以推进到正确的产量声明。
标签: python generator coroutine