gpt4 book ai didi

Python 的丰富比较行为(或者,当 Decimal ('100.0' 时)< .01)

转载 作者:太空狗 更新时间:2023-10-30 01:03:58 24 4
gpt4 key购买 nike

所以我有一个衬垫:

import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01))

它所做的只是创建一个包含 100.0 的 Decimal 对象,并以各种方式将其与 .01( float )进行比较。

我的结果是:

>>> import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01))
(False, True, NotImplemented, NotImplemented)

来自文档:“丰富的比较方法可能会返回单例 NotImplemented 如果它没有为给定的参数对实现操作。”

所以这里真的有三个问题。

  1. 当丰富的比较方法返回 NotImplemented 时,会发生什么?为什么它不引发异常?

  2. 当它获得 NotImplemented 时,为什么它在第一种情况下返回 False,而在第二种情况下返回 True? bool(NotImplemented) 应该是一个常量。

  3. 它是否简单地回退到 id() 检查?似乎没有(或者是,但倒退):

(忽略这一行,格式搞砸了,这个可以修复)

from decimal import Decimal
h = Decimal('100.0')
f = .01
print h < f, id(h) < id(f)
print h > f, id(h) > id(f)

我的结果测试于:

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on win32
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32

编辑:关于订购的文档:http://docs.python.org/library/stdtypes.html#comparisons

最佳答案

When a rich comparison method returns NotImplemented, what happens? Why doesn't it raise an Exception?

它委托(delegate)给相反的方法(例如,__lt__,当运算符是 >>)比较中的 RHS(float)——在这种情况下,它也返回 NotImplemented —— 并最终退回到 Python 2 用于异构比较的愚蠢的旧规则。

When it gets NotImplemented, why does it return False in the first case, and True in the second? bool(NotImplemented) should be a constant.

不涉及 bool——因为比较的双方都返回 NotImplemented(由于故意设计决定不支持小数和 float 之间的任何操作),愚蠢的旧规则被用作后备(并且在最近的版本中将比较类型,而不是实例——因此 id 与它无关)。在 Python 3 中,这种不受支持的异构比较会失败,并引发明显的异常,但在 Python 2 中,为了向后兼容,这是不可能发生的——它必须在 Python 2 的整个生命周期中以愚蠢的方式运行。

引入向后不兼容来修复现在被认为是设计错误的问题,例如关于 het 比较的这一部分,是引入 Python 3 的核心原因。只要您坚持使用 Python 2(例如因为它有更多的第三方扩展等),您需要微笑并忍受这些仅在 Python 3 中修复的缺陷。

关于Python 的丰富比较行为(或者,当 Decimal ('100.0' 时)< .01),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2834953/

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