Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从send()而不是next()开始运行协同程序_Python_Python 3.x_Coroutine - Fatal编程技术网

Python 从send()而不是next()开始运行协同程序

Python 从send()而不是next()开始运行协同程序,python,python-3.x,coroutine,Python,Python 3.x,Coroutine,我正在从David Beazley的精彩演讲中学习协同程序 我对一个简单的任务示例感到非常困惑,在这个示例中,生成器开始运行时没有继续next() 它开始时没有下一个() 至于福 In [10]: f1 = foo() In [11]: f1.send(1)

我正在从David Beazley的精彩演讲中学习协同程序

我对一个简单的任务示例感到非常困惑,在这个示例中,生成器开始运行时没有继续
next()

它开始时没有下一个()

至于福

In [10]: f1 = foo()                                                                                               

In [11]: f1.send(1)                                                                                               
TypeError: can't send non-None value to a just-started generator
它应该提前以
next()
开始


我如何理解这种情况?

错误描述告诉您什么是错误的以及您应该做什么-您应该将
None
发送到刚刚创建的生成器。这是
f1.send(None)
而不是
f1.send(1)
。通常情况下,协同程序与您在问题中提供的装饰器(class
Task
及其方法
run
)一起使用,或者与以下装饰器类似:

def coroutine(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        generator = func(*args, **kwargs)
        next(generator)
        return generator
    return wrapper

为什么任务在不调用next()的情况下运行?它没有装饰程序。
generator.send(None)
next(generator)
的替代方法
t1=Task(foo())
基本上是装饰性的,我明白了。foo()是一个被调用的函数,看起来是一个奇怪的装饰。
In [10]: f1 = foo()                                                                                               

In [11]: f1.send(1)                                                                                               
TypeError: can't send non-None value to a just-started generator
def coroutine(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        generator = func(*args, **kwargs)
        next(generator)
        return generator
    return wrapper