Python type hints for unpacking object

Question:

I’m trying to implement type hinting for object unpacking. Here is what I have currently

from typing import Tuple


class A:
    def __init__(self, x: int, y: str):
        self.x = x
        self.y = y

    def astuple(self) -> Tuple[int, str]:
        return self.x, self.y

    # Need to annotate the return type of __iter__
    def __iter__(self):
        return iter(self.astuple())


a = A(1, "a")
# This cannot infer the type of x and y
x, y = a
reveal_type(x)
reveal_type(y)
# This infers the type of p and q as int and str respectively
p, q = a.astuple()
reveal_type(p)
reveal_type(q)

prints

$ mypy unpack_object.py
unpack_object.py:20: note: Revealed type is "Any"
unpack_object.py:21: note: Revealed type is "Any"
unpack_object.py:24: note: Revealed type is "builtins.int"
unpack_object.py:25: note: Revealed type is "builtins.str"
Success: no issues found in 1 source file

However, I would like mypy to infer correct types for x, y (int, str). How can I achieve this?

Asked By: Aravind Nujella

||

Answers:

There is no way to define your own heterogeneous iterable type in Python. Make A a subclass of NamedTuple instead.

from typing import NamedTuple


class A(NamedTuple):
    x: int
    y: str


x, y = A(1, "a")
reveal_type(x)  # builtins.int
reveal_type(y)  # builtins.str
Answered By: chepner
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.