Defining a recursive type hint in Python?

10,120

You can specify recursive types in the typing language by using type aliases and forward reference strings,

Garthoks = Union[Garthok, Iterable['Garthoks']]

Note that recursive types are not yet supported by mypy. But it will likely be added eventually.


Update 2020/9/14: Microsoft announces support for recursive types in Pyright/Pylance.


Some types of forward references are handled by PEP0563. You can use them starting from Python 3.7 by doing from __future__ import annotations – Konstantin

Share:
10,120
JesusFreke
Author by

JesusFreke

Android developer and author of smali/baksmali

Updated on June 03, 2022

Comments

  • JesusFreke
    JesusFreke about 2 years

    Let's say I have a function that accepts a Garthok, an Iterable[Garthok], an Iterable[Iterable[Garthok]], etc.

    def narfle_the_garthoks(arg):
      if isinstance(arg, Iterable):
        for value in arg:
           narfle_the_garthoks(arg)
      else:
        arg.narfle()
    

    Is there any way to specify a type hint for arg that indicates that it accepts any level of Iterables of Garthoks? I suspect not, but thought I'd check if I'm missing something.

    As a workaround, I'm just specifying a few levels deep, and then ending with Iterable[Any].

    Union[Garthok,
        Iterable[Union[Garthok,
            Iterable[Union[Garthok, 
                Iterable[Union[Garthok, Iterable[Any]]]]]]]]