为什么两个字典对比,结果和想象的不同?

2020-06-20 22:10:06 +08:00
 qazwsxkevin
***
import decimal
from sqlalchemy import Integer,Numeric,String,INTEGER,DateTime,DECIMAL,null
***

if __name__ == '__main__':



    a = {'时间': datetime.datetime(2020, 5, 10, 11, 19), '力量': DECIMAL('26.77'), '量值': 90, '变化': None, '属性': None,
         '对方力量': DECIMAL('31.75'), 'TOP': 2291, '最低力量': DECIMAL('1.89'), '最高力量': 2022, 'roundid': '899',
         '序号': 1}
    b = {'时间': datetime.datetime(2020, 5, 10, 11, 25), '力量': DECIMAL('26.77'), '量值': 90, '变化': None, '属性': None,
         '对方力量': DECIMAL('31.75'), 'TOP': 2291, '最低力量': DECIMAL('1.89'), '最高力量': 2022, 'roundid': '899',
         '序号': 2}

    a.pop('序号')
    a.pop('时间')

    b.pop('序号')
    b.pop('时间')


    if a == b:
        print('相同')
    else:
        print('不同')

    # 这里对比结果是 False,为什么不同?   怀疑是 DECIMAL 的问题?我继续做了下面的测试

    a = decimal.Decimal('1.77')
    b = decimal.Decimal('1.77')

    if a == b:
        print('yes')
    else:
        print('no')

    if a == b:
        print('True')
    else:
        print('False')


    # 这里是 True....


    a = DECIMAL('1.77')
    b = DECIMAL('1.77')

    if a == b:
        print('yes')
    else:
        print('no')

    # 这里是 False

a 和 b,其实是在一个列表里,包含 N 个字典,历遍获取,是准备通过 sqlalchemy 写入到 mysql,
a 和 b,pop 了序号和时间两个元素后,内容肯定是一样的,
请教各位高手,a.b 对比出了什么问题?
3031 次点击
所在节点    Python
9 条回复
wuwukai007
2020-06-20 23:01:32 +08:00
def __eq__(self,obj):
>>>>if self.precision == obj.precision:
>>>>>>>>return True
>>>>else:
>>>>>>>>return False
DECIMAL.__eq__ = __eq__
a == b = True
lithbitren
2020-06-21 01:05:27 +08:00
字典里用内置库的 decimal.Decimal 比是相同的,再排查下是不是 sqlalchemy 模块的问题
qazwsxkevin
2020-06-21 02:51:31 +08:00
先谢谢两位,依然不是明白原因,想了一晚,看样子像是要把 a,b 两个字典里面,是 DECIMAL 类型的元素,转成 deciaml.Decimal 后,再去做比较,字典数量不少,有些担心效率严重慢了…
xuanbg
2020-06-21 06:18:46 +08:00
ab = decimal.Decimal('1.77')时,a 和 b 比的是值。
ab = DECIMAL('1.77')时,a 和 b 比的是对象,ab 是字典的时候比的也是对象。两个不同的对象当然不相等了。
toaruScar
2020-06-21 06:37:10 +08:00
你看过 sqlalchemy.DECIMAL 的文档了吗?
DECIMAL 是用来表示数据类型的,你是不是看着名字差不多就打算大力出奇迹了?
是不是还打算用 sqlalchemy.String 来存 str ?
iceking
2020-06-21 06:59:56 +08:00
>>> class foo():
... pass
...
>>> a = foo()
>>> b = foo()
>>> a == b
False

object 的 __eq__ 方法比较的两个对象的 id 。可以通过自己实现 __eq__ 来比较值。
iceking
2020-06-21 07:00:26 +08:00
@xuanbg 字典比较的是值
SjwNo1
2020-06-21 11:31:45 +08:00
你需要看 sqlalchemy.DECIMAL
SjwNo1
2020-06-21 11:35:03 +08:00
或者你可以重写 __eq__
DECIMAL 一般用来声明字段类型, 源码内部有一个 comparator_factory 可能对你有帮助

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/683378

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX