我尝试序列化(莳萝)一个包含嵌套在字典内的可莳萝对象的列表。dict 本身使用 importlib 导入到我的主脚本中。跟注dill.dump()
加注TypeError: can't pickle SwigPyObject objects
. 这是一些我设法重现错误以获得更多洞察力的代码。
some_config.py 位于 config/some_config.py 下:
from tensorflow.keras.optimizers import SGD
from app.feature_building import Feature
config = {
"optimizer": SGD(lr=0.001),
"features": [
Feature('method', lambda v: v + 1)
],
}
这是导入配置并尝试莳萝 config["features"] 的代码:
import dill
import importlib.util
from config.some_config import config
spec = importlib.util.spec_from_file_location(undillable.config,"config/some_config.py")
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
undillable_config = module.config
# Works prefectly fine
with open("dillable_config.pkl", "wb") as f:
dill.dump(config["features"], f)
# Raises TypeError: can't pickle SwigPyObject objects
with open("undillable_config.pkl", "wb") as f:
dill.dump(undillable_config["features"], f)
现在让我想知道的部分:使用 importlib 导入 config-dict 时会引发错误,经过一些调试后,我发现不仅如此,config["features"]
而且config["optimizer"]
还会被删除。但是,使用 normalimport
似乎有效,它只尝试 dillconfig["features"]
所以我的问题是,如果 dill 是由 importlib 而不是仅导入功能列表,为什么 dill 会尝试序列化整个 dict 以及如何修复此错误?