***
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 对比出了什么问题?
1
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 |
2
lithbitren 2020-06-21 01:05:27 +08:00
字典里用内置库的 decimal.Decimal 比是相同的,再排查下是不是 sqlalchemy 模块的问题
|
3
qazwsxkevin OP 先谢谢两位,依然不是明白原因,想了一晚,看样子像是要把 a,b 两个字典里面,是 DECIMAL 类型的元素,转成 deciaml.Decimal 后,再去做比较,字典数量不少,有些担心效率严重慢了…
|
4
xuanbg 2020-06-21 06:18:46 +08:00
ab = decimal.Decimal('1.77')时,a 和 b 比的是值。
ab = DECIMAL('1.77')时,a 和 b 比的是对象,ab 是字典的时候比的也是对象。两个不同的对象当然不相等了。 |
5
toaruScar 2020-06-21 06:37:10 +08:00 4
你看过 sqlalchemy.DECIMAL 的文档了吗?
DECIMAL 是用来表示数据类型的,你是不是看着名字差不多就打算大力出奇迹了? 是不是还打算用 sqlalchemy.String 来存 str ? |
6
iceking 2020-06-21 06:59:56 +08:00
>>> class foo():
... pass ... >>> a = foo() >>> b = foo() >>> a == b False object 的 __eq__ 方法比较的两个对象的 id 。可以通过自己实现 __eq__ 来比较值。 |
8
SjwNo1 2020-06-21 11:31:45 +08:00
你需要看 sqlalchemy.DECIMAL
|
9
SjwNo1 2020-06-21 11:35:03 +08:00
或者你可以重写 __eq__
DECIMAL 一般用来声明字段类型, 源码内部有一个 comparator_factory 可能对你有帮助 |