2017-03-16 2 views
0

Der folgende Code funktioniert nicht wie erwartet. Offenbar kann ich nicht die eigene Typdefinition innerhalb der Klasse Klassen verwenden:typisierte Python: Verwendung der Klassen eigenen Typ innerhalb der Klassendefinition

class Foo: 
    def __init__(self, key :str) -> None: 
     self.key = key 

    def __eq__(self, other :Foo) -> bool: 
     return self.key == other.key 

print('should be true: ', Foo('abc') == Foo('abc')) 
print('should be false: ', Foo('abc') == Foo('def')) 

Das Ergebnis es läuft:

Traceback (most recent call last): 
    File "class_own_type.py", line 1, in <module> 
    class Foo: 
    File "class_own_type.py", line 5, in Foo 
    def __eq__(self, other :Foo) -> bool: 
NameError: name 'Foo' is not defined 

Auch die Überprüfung der Code mit mypy kehrt:

class_own_type.py:5: error: Argument 1 of "__eq__" incompatible with supertype "object" 

Wie kann ich diesen Code korrigieren, sowohl für Python als auch für mypy?

Antwort

0

Der Name Foo ist noch nicht gebunden, da die Klasse selbst noch nicht definiert wurde, als Sie versuchten, den Namen zu verwenden .

können Sie Stringliterale, Bewertung des Typs zu verzögern:

class Foo: 
    def __init__(self, key :str) -> None: 
     self.key = key 

    def __eq__(self, other: 'Foo') -> bool: 
     return self.key == other.key 

print('should be true: ', Foo('abc') == Foo('abc')) 
print('should be false: ', Foo('abc') == Foo('def')) 
+0

Dies macht den Code laufen ohne Fehler, aber ich habe noch die mypy Fehler. – macjan

+0

Das ist falsch; wie Macjan darauf hinweist, behebt dies den Python-Fehler, aber es mypy nicht beruhigen. – weberc2

+1

@ weberc2 Nun, ich weiß nicht, wie ich es beheben kann, und ich kann es nicht löschen, weil es die akzeptierte Antwort ist. Wenn Sie die Antwort wissen, könnten Sie es bearbeiten? – wim

Verwandte Themen