编码基本上是字典的字符串表示形式,包含对象的字段。但是,字典不遵守顺序,因此我可能会在不同的运行中获得不同的编码字符串。我如何防止这种情况发生?还是应该使用另一个可以确保确定性编码的库?
通过确定性编码,我的意思是,如果创建100000个几乎相同的对象,即相同的类和相同的构造函数args,则当我对它们中的每一个调用encode()
时,每次都会得到完全相同的字符串
例如,如果我有
class MyClass(object):
def __init__(self, a, b):
self.a = a
self.b = b
c1 = MyClass(1, 2)
c2 = MyClass(1, 2)
我想确保字符串encode(c1)和encode(c2)完全相同,一个字符一个字符,即
assert jsonpickle.encode(c1)==jsonpickle.encode(c2)
答案 0 :(得分:0)
我认为jsonpickle将解决您所谓的确定性赋予。
示例
import jsonpickle
class Monopoly(object):
def __init__(self):
self.boardwalk_price = 500
@property
def boardwalk(self):
self.boardwalk_price += 50
return self.boardwalk_price
m = Monopoly()
serialized = jsonpickle.encode(m)
看看
print (serialized)
{"py/object": "__main__.Monopoly", "boardwalk_price": 500}
现在,让我们解码
d = jsonpickle.decode(serialized)
print (d)
<__main__.Monopoly object at 0x7f01bc093278>
d.boardwalk_price
500
为了比较对象,Python使用标识符。
class MyClass(object):
def __init__(self, a, b):
self.a = a
self.b = b
c1 = MyClass(1, 2)
c2 = MyClass(1, 2)
如果您看一下ID
id(c1)
140154854189040
id(c2)
140154854190440
c1 == c2
False
您可以覆盖 eq 运算符
def __eq__(self, x):
if isinstance(x, number):
return self.number == x.number
return False