gpt4 book ai didi

Python 历史和设计 : Why issubclass() instead of rich comparisons?

转载 作者:行者123 更新时间:2023-11-28 23:02:16 24 4
gpt4 key购买 nike

在 Python 中,比较运算符 -- < , <= , == , != , > , >= -- 可以实现表示与实现类相关的任何内容。在 Python 2 中,这是通过重写 __cmp__ 完成的。 ,并在 Python 3 中重写 __lt__和 friend 。拥有 issubclass() 有什么好处?内置方法,而不是允许使用 bool < int 等表达式(真),int < object (真),int <= int , 或 int < float (错误的)。特别是,我会注意到按 issubclass() 排序的类构成partially ordered set在数学意义上。

Python 3 等同于我的想法如下所示。此代码不会替换 issubclass() (尽管通过 MRO 循环就可以做到这一点,对吧?)。但是,这不是更直观吗?

@functools.total_ordering
class Type(type):
"Metaclass whose instances (which are classes) can use <= instead issubclass()"
def __lt__(self, other):
try:
return issubclass(self, other) and self != other
except TypeError: # other isn't a type or tuple of types
return NotImplemented
def __eq__(self, other):
if isinstance(other, tuple): # For compatibility with __lt__
for other_type in other:
if type(self) is type(other_type):
return False
return True
else:
return type(self) is type(other)

实际问题:使用 issubclass() 内置方法而不是允许诸如 bool < int (true)、int < object (true)、int < = int 或 int < float (false)。

最佳答案

因为它违背了 Python 的禅宗:http://www.python.org/dev/peps/pep-0020/

显式优于隐式。

如果您单独查看以下代码行:

issubclass(a, b)

很明显 ab 是包含类的变量,我们正在检查 a 是否是 b< 的子类。如果它们碰巧不包含类,您就会知道。

但是看着这个

a < b

不会告诉你任何事情。在您知道我们正在检查 a 中的类是否是 b 的子类之前,您需要检查周围的代码以确定它们包含类。如果说 a=5 和 b=6,它仍然会“正常”运行。

但是 Python 很灵活,所以如果您真的想要这个,您可以实现一个具有您所展示的行为的基类型。

实际上 - 顺便说一句 - 例如,C++ 中重载运算符的流行是该语言的一个重大缺点(至少在我看来),因为当你看到 a + b 时,它也可能为你所知道的一切发射核导弹......直到你检查 a/b 的类型,查找类实现和 + 运算符重载实现(如果有......如果没有,看看是否父类有没有……如果没有就看父类有没有……)

关于Python 历史和设计 : Why issubclass() instead of rich comparisons?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10095628/

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