编辑:我注意到人们评论说类型提示不应该和__eq__
一起使用,当然,它不应该。但这不是我问题的重点。我的问题是为什么类不能在方法参数中用作类型提示,但可以在方法本身中使用?
Python类型提示在我使用PyCharm时非常有用,但是,当我试图在类的方法中使用类自己的类型时,我发现了一些奇怪的行为。
例如:
class Foo:
def __init__(self, id):
self.id = id
pass
def __eq__(self, other):
return self.id == other.id
在这里,当输入other.
时,属性id
不会自动提供,我希望通过定义__eq__
来解决这个问题,如下所示:
def __eq__(self, other: Foo):
return self.id == other.id
但是,这给出了NameError: name 'Foo' is not defined
,但是当我在方法中使用类型时,id
在other.
之后提供:
def __eq__(self, other):
other: Foo
return self.id == other.id
我的问题是,为什么不能使用类自己的类型来提示参数,而在方法中却可以?
3条答案
按热度按时间liwlm1x91#
名称
Foo
还不存在,因此需要使用'Foo'
(mypy
和其他类型检查器应该将其识别为前向引用)。或者,您可以使用
这阻止了对 all 注解的求值,而只是将它们存储为字符串以供以后引用(这将是Python 3.10中的默认设置)。
最后,正如注解中所指出的,
__eq__
一开始就不应该这样暗示,第二个参数应该是一个任意的对象;如果你不知道如何比较你的示例,你将返回NotImplemented
(谁知道呢,也许 it 知道如何比较它自己和 your 示例,如果Foo.__eq__(Foo(), Bar())
返回NotImplemented
,那么Python将尝试Bar.__eq__(Bar(), Foo())
)。或者使用鸭子打字,
在任一情况下,
Any
提示都是可选的。qco9c6ql2#
从python3.11开始,现在可以使用
Self
来输入hint当前类。例如,下面是有效的python:
下面是这些文档的链接
并且是堆栈溢出时指向another answer的链接
ctzwtxfj3#
因为你不指定输入的类型ide不能理解你正在处理的.
尝试: