Kurze Antwort, müssen Sie den Modulnamen der Klasse gehören, und Sie müssen das Modul innerhalb einer unerreichbaren Code importieren, wie folgt aus:
if False:
# for forward-reference type-checking:
import mymodule
class MyClass(object):
def __init__(self):
self.sender = None # type: mymodule.Node
Um zu verstehen, warum dies erforderlich ist (und Warum es funktioniert), müssen Sie zuerst erkennen, dass mypy macht statische Code-Analyse. Das heißt, es importiert Ihre Module nicht, es analysiert und analysiert Text, der von Ihren Moduldateien gelesen wurde.
Wenn das obige Modul importiert wird, wird die import mymodule
Zeile nie ausgeführt und vermeidet daher Ihren zyklischen Import, aber es ist weiterhin für mypy verfügbar, um zu analysieren. Auf diese Weise kann mypy während der Analyse den Verweis auf mymodule.Node
auflösen.
Aus Gründen der Vollständigkeit sollte ich erwähnen, dass es nicht, dass Sie den Modulnamen verwenden erforderlich ist, können Sie einen beliebigen Namen verwenden, der keinen Konflikt bei der Analyse verursachen:
if False:
from mymodule import Node
class MyClass(object):
def __init__(self):
self.sender = None # type: Node
Beachten Sie auch, dass Sie müssen keine Anführungszeichen um Typnamen verwenden, die in Kommentaren vorkommen. Dies ist nur notwendig, wenn die Typ-Annotation direkt in einem Python-Objekt erscheint. Hier sind einige Szenarien, wo das passieren könnte:
from typing import Optional, NamedTuple
if False:
from mymodule import Node
NodeInfo = NamedTuple('NodeInfo', [('node', 'Node'), ('info', dict)])
class MyClass(object):
def __init__(self, sender: Optional['Node'] = None):
self.sender = sender