Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recursive Typing in Python 3.5+ [duplicate]

Tags:

In Python 3.5, type annotations were added (see here).

Is there a way of defining recursive type annotations, such as for a tree-like structure?

class Employee(object):     def __init__(self, name: str, reports: List[Employee]):        self.name = name        self.reports = reports 

In the above, it doesn't seem as though the annotation List[Employee] works. Running the code results in this error:

NameError: name 'Employee' is not defined

like image 564
nimda Avatar asked Jul 13 '16 00:07

nimda


1 Answers

You can use Forward References as defined in PEP 484

A situation where this occurs commonly is the definition of a container class, where the class being defined occurs in the signature of some of the methods. For example, the following code (the start of a simple binary tree implementation) does not work:

class Tree:     def __init__(self, left: Tree, right: Tree):         self.left = left         self.right = right 

To address this, we write:

class Tree:     def __init__(self, left: 'Tree', right: 'Tree'):         self.left = left         self.right = right 

It is allowable to use string literals as part of a type hint, for example:

class Tree:     ...     def leaves(self) -> List['Tree']: 
like image 97
Brendan Abel Avatar answered Oct 21 '22 20:10

Brendan Abel