Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mutually recursive types in Python 3.6, using named tuple syntax [duplicate]

I'm trying to implement Nodes and Edges for a graph. Here is my code:

from typing import NamedTuple, List

class Node(NamedTuple):
    name: str
    edges: List[Edge]

class Edge(NamedTuple):
    src: Node
    dest: Node

This raises an error because the Edge type is not defined when Node is created.

NameError: name 'Edge' is not defined

Switching the definitions around doesn't work because Edge also refers to Node.

How can I make it work?

like image 323
Michael Hewson Avatar asked Jan 25 '17 22:01

Michael Hewson


1 Answers

Use string literals.

from typing import NamedTuple, List

class Node(NamedTuple):
    name: str
    edges: List['Edge']

class Edge(NamedTuple):
    src: Node
    dest: Node

The details are in PEP-484, under the "Forward References" section:

When a type hint contains names that have not been defined yet, that definition may be expressed as a string literal, to be resolved later.

like image 132
wim Avatar answered Nov 15 '22 04:11

wim