# New features in Python 3.6

Python 3.6 was released in December 2016. As of mypy 0.510 all language features new in Python 3.6 are supported.

## Syntax for variable annotations (PEP 526)

Python 3.6 feature: variables (in global, class or local scope) can now have type annotations using either of the two forms:

    from typing import Optional
    foo: Optional[int]
    bar: List[str] = []

Mypy fully supports this syntax, interpreting them as equivalent to

    foo = None  # type: Optional[int]
    bar = []  # type: List[str]

An additional feature defined in PEP 526 is also supported: you can mark names intended to be used as class variables with `ClassVar`. In a pinch you can also use ClassVar in `# type` comments. Example:

    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

## Literal string formatting (PEP 498)

Python 3.6 feature: string literals of the form `f"text {expression} text"` evaluate `expression` using the current evaluation context (locals and globals).

Mypy fully supports this syntax and type-checks the `expression`.

## Underscores in numeric literals (PEP 515)

Python 3.6 feature: numeric literals can contain underscores, e.g. `1_000_000`.

Mypy fully supports this syntax:

    precise_val = 1_000_000.000_000_1
    hexes: List[int] = []
    hexes.append(0x_FF_FF_FF_FF)

## Asynchronous generators (PEP 525) and comprehensions (PEP 530)

Python 3.6 allows coroutines defined with `async def` (PEP 492) to be generators, i.e. contain `yield` expressions, and introduces a syntax for asynchronous comprehensions. Mypy fully supports these features, for example:

    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 syntax for named tuples. See Named tuples.