我正在使用生成器作为协程,正如David Beazley在其三个精彩演讲中所描述的那样(位于http://www.dabeaz.com/coroutines/),但我无法确定如何输入装饰器consumer
。这是我目前的代码:
from typing import Any, Callable, Generator, Iterable
ArbGenerator = Generator[Any, Any, Any]
def consumer(fn: ❓) -> ❓:
@wraps(fn)
def start(*args: Any) -> ArbGenerator:
c = fn(*args)
c.send(None)
return c
return start
使用示例,有点删节:
@consumer
def identity(target: ArbGenerator) -> ArbGenerator:
while True:
item = yield
target.send(item)
@consumer
def logeach(label: Any, target: ArbGenerator) -> ArbGenerator:
while True:
item = yield
print(label, item)
target.send(item)
pipeline = identity(logeach("EXAMPLE", some_coroutine_sink()))
加粗的 ❓
标记表示我不确定 - 我也不确定我定义的类型 ArbGenerator
。问题是,如果没有 (装饰器) 函数 consumer
自身被编写,我不确定 mypy
是否分析带有该装饰器的生成器函数,这就是我对 ArbGenerator
不确定的原因。
我对最紧密的类型感兴趣,比 Any
更好,这样当我组合这些协程链时,如果链条没有正确设置,mypy
将会给我一个很好的警告。
(如果有影响,则为 Python 3.5.)
typing.Coroutine
? - MazdakCoroutine
是特定于异步的。 - davidbak