Я работаю с генераторами как сопрограммы, как описано в превосходном триплете презентаций Дэвида Бизли (на 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, если это имеет значение.)