Ответ 1
Я понял ответ самостоятельно.
Я искал, но не нашел документацию для трех типов параметров Generator
в официальной документации по типу для Python 3.5.2 - за истинно загадочным упоминанием...
class typing.Generator(Iterator[T_co], Generic[T_co, T_contra, V_co])
К счастью, оригинальный PEP484 (который начал все это) был гораздо полезнее:
"Возвращаемый тип функций генератора может быть аннотирован генератором Generic [output_type, send_type, return_type], предоставленным модулем typing.py:
def echo_round() -> Generator[int, float, str]:
res = yield
while res:
res = yield round(res)
return 'OK'
Исходя из этого, я смог аннотировать мои генераторы и увидел mypy
подтверждение моих назначений:
from typing import Callable, Generator
# A protocol decoder:
#
# - yields Nothing
# - expects ints to be `send` in his yield waits
# - and doesn't return anything.
ProtocolDecodingCoroutine = Generator[None, int, None]
# A frame consumer (passed as an argument to a protocol decoder):
#
# - yields Nothing
# - expects List[int] to be `send` in his waiting yields
# - and doesn't return anything.
FrameConsumerCoroutine = Generator[None, List[int], None]
def unwrap_protocol(header: int=0x61,
footer: int=0x62,
dle :int=0xAB,
after_dle_func: Callable[[int], int]=lambda x: x,
target: FrameConsumerCoroutine=None) -> ProtocolDecodingCoroutine:
...
def frame_receiver() -> FrameConsumerCoroutine:
...
Я проверил свои задания, например. поменяв порядок типов, а затем, как и ожидалось, mypy
пожаловался и попросил правильные (как видно выше).
Полный код доступен здесь.
Я оставлю вопрос открытым на пару дней, если кто-то захочет перезвонить - особенно с точки зрения использования новых стилей coroutine для Python 3.5 (async def
и т.д.) - я был бы признателен за подсказку как они будут использоваться здесь.