From b858af61b9bd2f58de0b6023002e9ce3df82b90d Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 5 Aug 2016 12:56:09 -0700 Subject: [PATCH] Add typing.Generator docs, by Michael Lee. --- Doc/library/typing.rst | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index d797aeca5a0..c870485796b 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -556,6 +556,35 @@ The module defines the following classes, functions and decorators: .. class:: Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]) + A generator can be annotated by the generic type + ``Generator[YieldType, SendType, ReturnType]``. For example:: + + def echo_round() -> Generator[int, float, str]: + sent = yield 0 + while sent >= 0: + sent = yield round(sent) + return 'Done' + + Note that unlike many other generics in the typing module, the ``SendType`` + of :class:`Generator` behaves contravariantly, not covariantly or + invariantly. + + If your generator will only yield values, set the ``SendType`` and + ``ReturnType`` to ``None``:: + + def infinite_stream(start: int) -> Generator[int, None, None]: + while True: + yield start + start += 1 + + Alternatively, annotate your generator as having a return type of + ``Iterator[YieldType]``:: + + def infinite_stream(start: int) -> Iterator[int]: + while True: + yield start + start += 1 + .. class:: io Wrapper namespace for I/O stream types.