Python type hints for unpacking object

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
# This infers the type of p and q as int and str respectively
p, q = a.astuple()


$ mypy note: Revealed type is "Any" note: Revealed type is "Any" note: Revealed type is "" 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?

>Solution :

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)  #
reveal_type(y)  # builtins.str

Leave a Reply