2017-03-16 58 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