gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:26:10 26 4
gpt4 key购买 nike

编辑 :我注意到有人评论类型提示不应该与 __eq__ 一起使用,当然,它不应该。但这不是我的问题的重点。我的问题是 为什么该类不能用作方法中的类型提示参数 ,但可以在方法中使用本身 ?

事实证明,在使用 PyCharm 时,Python 类型提示对我非常有用。但是,当尝试在其方法中使用类自己的类型时,我遇到了一些奇怪的行为。
例如:

class Foo:

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

def __eq__(self, other):
return self.id == other.id
在这里,输入 other. 时,属性(property) 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
我的问题是,为什么不能使用类自己的类型来提示参数的类型,而在方法中却是可能的?

最佳答案

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

def __eq__(self, other: 'Foo'):
return self.id == other.id
或者,您可以使用
from __future__ import annotations
这可以防止对所有注释进行评估,而是将它们简单地存储为字符串以供以后引用。 (这将是 Python 3.10 中的默认设置。)
最后,正如评论中所指出的, __eq__一开始就不应该这样暗示。第二个参数应该是一个任意对象;你会回来 NotImplemented如果您不知道如何将您的实例与它进行比较。 (谁知道呢,也许它知道如何将自己与您的实例进行比较。如果 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提示是可选的。

关于Python 类型在方法中暗示自己的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63503512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com