Python类型在方法中提示自己的类

sr4lhrrt  于 2023-03-09  发布在  Python
关注(0)|答案(3)|浏览(153)

编辑:我注意到人们评论说类型提示不应该和__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,但是当我在方法中使用类型时,idother.之后提供:

def __eq__(self, other):
        other: Foo
        return self.id == other.id

我的问题是,为什么不能使用类自己的类型来提示参数,而在方法中却可以?

liwlm1x9

liwlm1x91#

名称Foo还不存在,因此需要使用'Foo'mypy和其他类型检查器应该将其识别为前向引用)。

def __eq__(self, other: 'Foo'):
    return self.id == other.id

或者,您可以使用

from __future__ import annotations

这阻止了对 all 注解的求值,而只是将它们存储为字符串以供以后引用(这将是Python 3.10中的默认设置)。
最后,正如注解中所指出的,__eq__一开始就不应该这样暗示,第二个参数应该是一个任意的对象;如果你不知道如何比较你的示例,你将返回NotImplemented(谁知道呢,也许 it 知道如何比较它自己和 your 示例,如果Foo.__eq__(Foo(), Bar())返回NotImplemented,那么Python将尝试Bar.__eq__(Bar(), Foo()))。

from typing import Any

def __eq__(self, other: Any) -> bool:
    if isinstance(other, Foo):
        return self.id == other.id
    return NotImplemented

或者使用鸭子打字,

def __eq__(self, other: Any) -> bool:
    # Compare to anything with an `id` attribute
    try:
        return self.id == other.id
    except AttributeError:
        return NotImplemented

在任一情况下,Any提示都是可选的。

qco9c6ql

qco9c6ql2#

从python3.11开始,现在可以使用Self来输入hint当前类。
例如,下面是有效的python:

from typing import Self

class Foo:
   def return_self(self) -> Self:
      ...
      return self

下面是这些文档的链接
并且是堆栈溢出时指向another answer的链接

ctzwtxfj

ctzwtxfj3#

因为你不指定输入的类型ide不能理解你正在处理的.
尝试:

class Foo:

    def __init__(self, id):
        self.id = id
        pass

    def __eq__(self, other: Foo):
        return self.id == other.id

相关问题