Я пишу скрипт кэширования, который берет определенный объект и сохраняет его как файл. Первоначальные параметры объекта должны использоваться как имя файла (потому что я хочу разные кеши для разных начальных параметров).Рассольные свалки не имеют уникального представления? Создайте уникальную сериализацию словаря Python
Я думал, что сериализация была биекцией, поэтому я планировал сериализовать словарь (параметр), создать шестнадцатеричный код с использованием hashlib.sha224().hexdigest()
и использовать первые XX символов в качестве имени файла. Тем не менее, неоднократно сериализация словаря с использованием pickle.dumps
дает разные сериализации ...
Я хочу сериализацию словаря:
attr = {'I': 1,
'LBar': 1,
'N': 50,
'ProdMatch': 1,
'T': 10,
'alpha': 0.5,
'b': 0.1,
'c': 0.1,
'delta': 0.1,
'deltaN': 0.02,
'deltaT': 10.0,
'logspace': False,
'nT': 1,
'period': 'quarterly',
'rho': 0.03,
'sigma': 0.5}
ser = pickle.dumps(attr)
print(pickle.loads(ser))
Который дает мне выход словарь ввода и следующую строку.
b'\x80\x03}q\x00(X\x01\x00\x00\x00cq\x01G?\xb9\x99\x99\x99\x99\x99\x9aX\x01\x00\x00\x00Nq\x02K2X\x01\x00\x00\x00Tq\x03K\nX\x05\x00\x00\x00deltaq\x04G?\xb9\x99\x99\x99\x99\x99\x9aX\x06\x00\x00\x00deltaNq\x05G?\x94z\xe1G\xae\x14{X\x06\x00\x00\x00deltaTq\[email protected]$\x00\x00\x00\x00\x00\x00X\x05\x00\x00\x00alphaq\x07G?\xe0\x00\x00\x00\x00\x00\x00X\x03\x00\x00\x00rhoq\x08G?\x9e\xb8Q\xeb\x85\x1e\xb8X\x04\x00\x00\x00LBarq\tK\x01X\x01\x00\x00\x00bq\nG?\xb9\x99\x99\x99\x99\x99\x9aX\x06\x00\x00\x00periodq\x0bX\t\x00\x00\x00quarterlyq\x0cX\x02\x00\x00\x00nTq\rK\x01X\x01\x00\x00\x00Iq\x0eK\x01X\t\x00\x00\x00ProdMatchq\x0fK\x01X\x05\x00\x00\x00sigmaq\x10G?\xe0\x00\x00\x00\x00\x00\x00X\x08\x00\x00\x00logspaceq\x11\x89u.'
Я тогда перезагрузить интерпретатор Python и запустить тот же сценарий:
b'\x80\x03}q\x00(X\x05\x00\x00\x00deltaq\x01G?\xb9\x99\x99\x99\x99\x99\x9aX\x05\x00\x00\x00alphaq\x02G?\xe0\x00\x00\x00\x00\x00\x00X\x04\x00\x00\x00LBarq\x03K\x01X\x01\x00\x00\x00Iq\x04K\x01X\x02\x00\x00\x00nTq\x05K\x01X\x01\x00\x00\x00bq\x06G?\xb9\x99\x99\x99\x99\x99\x9aX\x01\x00\x00\x00Tq\x07K\nX\x03\x00\x00\x00rhoq\x08G?\x9e\xb8Q\xeb\x85\x1e\xb8X\x01\x00\x00\x00cq\tG?\xb9\x99\x99\x99\x99\x99\x9aX\t\x00\x00\x00ProdMatchq\nK\x01X\x06\x00\x00\x00periodq\x0bX\t\x00\x00\x00quarterlyq\x0cX\x06\x00\x00\x00deltaNq\rG?\x94z\xe1G\xae\x14{X\x06\x00\x00\x00deltaTq\[email protected]$\x00\x00\x00\x00\x00\x00X\x05\x00\x00\x00sigmaq\x0fG?\xe0\x00\x00\x00\x00\x00\x00X\x08\x00\x00\x00logspaceq\x10\x89X\x01\x00\x00\x00Nq\x11K2u.'
Это разные сериализации. Pickle не разбит, так как loads()
будет восстанавливать исходный словарь, но я не могу использовать это поведение для своих целей, так как он не найдет сохраненный файл, если он ищет другой хеш. Я также попробовал dill.dumps
, с тем же результатом.
ли эта работа для вас? –