| .. _python-36: |
| |
| New features in Python 3.6 |
| ========================== |
| |
| Mypy has supported all language features new in Python 3.6 starting with mypy |
| 0.510. This section introduces Python 3.6 features that interact with |
| type checking. |
| |
| Syntax for variable annotations (`PEP 526 <https://www.python.org/dev/peps/pep-0526>`_) |
| --------------------------------------------------------------------------------------- |
| |
| Python 3.6 introduced a new syntax for variable annotations (in |
| global, class and local scopes). There are two variants of the |
| syntax, with or without an initializer expression: |
| |
| .. code-block:: python |
| |
| from typing import Optional |
| foo: Optional[int] # No initializer |
| bar: List[str] = [] # Initializer |
| |
| .. _class-var: |
| |
| You can also mark names intended to be used as class variables with |
| ``ClassVar``. In a pinch you can also use ClassVar in ``# type`` |
| comments. Example: |
| |
| .. code-block:: python |
| |
| from typing import ClassVar |
| |
| class C: |
| x: int # Instance variable |
| y: ClassVar[int] # Class variable |
| z = None # type: ClassVar[int] |
| |
| def foo(self) -> None: |
| self.x = 0 # OK |
| self.y = 0 # Error: Cannot assign to class variable "y" via instance |
| |
| C.y = 0 # This is OK |
| |
| |
| .. _async_generators_and_comprehensions: |
| |
| Asynchronous generators (`PEP 525 <https://www.python.org/dev/peps/pep-0525>`_) and comprehensions (`PEP 530 <https://www.python.org/dev/peps/pep-0530>`_) |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| |
| Python 3.6 allows coroutines defined with ``async def`` (PEP 492) to be |
| generators, i.e. contain ``yield`` expressions. It also introduced a syntax for |
| asynchronous comprehensions. This example uses the ``AsyncIterator`` type to |
| define an async generator: |
| |
| .. code-block:: python |
| |
| from typing import AsyncIterator |
| |
| async def gen() -> AsyncIterator[bytes]: |
| lst = [b async for b in gen()] # Inferred type is "List[bytes]" |
| yield 'no way' # Error: Incompatible types (got "str", expected "bytes") |
| |
| New named tuple syntax |
| ---------------------- |
| |
| Python 3.6 supports an alternative, class-based syntax for named tuples. |
| See :ref:`named-tuples` for the details. |