Type hints and chained assignment and multiple assignments
Asked Answered
H

1

30

I guess these two questions are related, so I'll post them together:

1.- Is it possible to put type hint in chained assignments?

These two attempts failed:

>>> def foo(a:int):
...     b: int = c:int = a
  File "<stdin>", line 2
    b: int = c:int = a
              ^
SyntaxError: invalid syntax
>>> def foo(a:int):
...     b = c:int = a
  File "<stdin>", line 2
    b = c:int = a
         ^
SyntaxError: invalid syntax

2.- Is it possible to put type hint in multiple assignments?

These were my attempts:

>>> from typing import Tuple
>>> def bar(a: Tuple[int]):
...     b: int, c:int = a
  File "<stdin>", line 2
    b: int, c:int = a
          ^
SyntaxError: invalid syntax
>>> def bar(a: Tuple[int]):
...     b, c:Tuple[int] = a
... 
  File "<stdin>", line 2
SyntaxError: only single target (not tuple) can be annotated
>>> def bar(a: Tuple[int]):
...     b, c:int = a
... 
  File "<stdin>", line 2
SyntaxError: only single target (not tuple) can be annotated

I am aware that in both cases the type is inferred from the type hint of a, but I have a long variable list (in the __init__ of a class) and I want to be extra-explicit.

I am using Python 3.6.8.

Hymanhymen answered 15/6, 2019 at 16:3 Comment(1)
We really prefer one question per question. The second half is a duplicate of #52083439 which has some additional solutions in the answers.Sycosis
C
43
  1. As explicitly stated in PEP 526, section "Rejected/postponed proposals", annotations in chained assignments are not supported. Quoting the PEP:

    This has problems of ambiguity and readability similar to tuple unpacking, for example in:
    x: int = y = 1
    z = w: int = 1
    it is ambiguous, what should the types of y and z be? Also the second line is difficult to parse.

  2. For unpacking, per the same PEP, you should place bare annotations for your variables before the assignment. Example from the PEP:

    # Tuple unpacking with variable annotation syntax
    header: str
    kind: int
    body: Optional[List[str]]
    header, kind, body = message
    
Crore answered 15/6, 2019 at 16:17 Comment(1)
This is very helpful, thank you. However, it is already four years from the question and answer. Have things changed or is the answer still the (only) correct way? Intuitively I would write, for example, a: int, b: str = func() for a function returning tuple[int, str]. But it does not work.Mikamikado

© 2022 - 2024 — McMap. All rights reserved.