Хэш сериализации Python / Dill в зависимости от импортированных пакетов?

#python #dill

#python #dill

Вопрос:

Рассмотрим следующий код:

 from os.path import join
import dill
from tempfile import TemporaryDirectory
import hashlib

def filehash(path):
    with open(path, 'rb') as f:
        return hashlib.sha256(f.read()).hexdigest()

def func(a,b):
    return a   b
    
with TemporaryDirectory() as td:
    temp = join(td, "func.tmp")
    with open(temp, "wb") as f:
        dill.dump(func, f)
    print(filehash(temp))
  

Это сериализует простую функцию func() на диск, а затем выводит хэш результирующего файла.

Теперь добавьте оператор импорта некоторого пакета, который не будет использоваться до первой строки, например import numpy , и снова запустите всю программу. Теперь хэш файла отличается.

Может кто-нибудь сказать мне, почему это так?

Ответ №1:

Когда Dill выбирает функцию, он должен сохранять области, к которым функция может получить доступ. Итак, когда вы добавляете импорт, то, что сохраняется, также изменяется, поскольку оно включает область действия модуля, которая была изменена при импорте.

Если вы этого не хотите, я рекомендую поместить функции, которые вы собираетесь использовать, в отдельный модуль. Чтобы область их модуля не содержала ничего, к чему им не нужно обращаться.

Я бы также рекомендовал не зависеть от одного и того же кода, создающего один и тот же dill.