2017-03-16 81 views
0

以下代碼不能按預期方式工作。顯然,我不能使用類自己的類型內的類定義:鍵入python:在類定義中使用類自己的類型

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')) 

運行它的結果是:

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 

而且,與mypy返回檢查代碼:

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

如何糾正這段代碼對於Python和mypy都有效?

回答

0

名稱Foo尚未綁定,因爲在嘗試使用該名稱時該類本身尚未定義(請記住,函數參數在函數定義時計算,而不是在函數調用時計算) 。

您可以使用字符串常量,延遲類型的評價:

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

這使得沒有錯誤的代碼運行,但我仍然得到mypy錯誤。 – macjan

+0

這是錯誤的;正如macjan指出的那樣,這樣可以修復Python錯誤,但它不會安撫mypy。 – weberc2

+1

@ weberc2那麼,我不知道如何解決它,我不能刪除它,因爲這是被接受的答案。如果你知道答案,你可以編輯它嗎? – wim