2016-06-09 22 views
0

Ich versuche, das Folgende zu tun:mypy expliziter Typ Hinweis in Anführungszeichen ergibt noch nicht definiert Fehler

self.sender = None # type: 'Node' 

Ich kann nicht Knoten importiert werden, weil ich einen Zyklus bekommen würde. Also schreibe ich es Zitate in wie http://mypy.readthedocs.io/en/latest/common_issues.html#import-cycles hier erwähnt Aber ich bekomme immer noch die folgenden Fehler

error: Name 'Node' is not defined 

Gibt es eine Lösung für diesen?

Danke!

Antwort

1

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