gpt4 book ai didi

python - 重命名模块后 Unpickling 对象

转载 作者:行者123 更新时间:2023-11-28 22:32:26 25 4
gpt4 key购买 nike

我在重命名模块后通过 numpy.load 加载对象时遇到问题。这是一个显示问题的简单示例。

假设在 mymodule.py 中定义了一个类:

class MyClass(object):
a = "ciao"
b = [1, 2, 3]

def __init__(self, value=2):
self.value = value

从 python session 我可以简单地创建一个实例并保存它:

import numpy as np
import mymodule

instance = mymodule.MyClass()
np.save("dump.npy", instance)

加载文件效果很好(即使是从同一文件夹中启动的新 session ):

np.load("dump.npy")

如果我现在重命名模块:

mv mymodule.py mymodule2.py

加载失败。这是预料之中的,但我希望通过在加载之前导入模块:

import mymodule2 as mymodule

可以找到对象定义......但它不起作用。这意味着: 1.我不明白它是如何工作的 2. 我被迫在我正在部分重构的项目中保留指向重命名文件的符号链接(symbolic link)。

还有什么我可以做的来避免符号链接(symbolic link)解决方案吗?并避免将来遇到同样的问题?

非常感谢,马可[这是我的第一个问题,如果我做错了什么,抱歉]

最佳答案

NumPy uses pickle对于带有对象的数组,但在其顶部添加一个标题。因此,您需要做的不仅仅是编写自定义 Unpickler 代码。 :

import pickle

from numpy.lib.format import read_magic, _check_version, _read_array_header


class RenamingUnpickler(pickle.Unpickler):
def find_class(self, module, name):
if module == 'mymodule':
module = 'mymodule2'
return super().find_class(module, name)


with open('dump.npy', 'rb') as fp:
version = read_magic(fp)
_check_version(version)
dtype = _read_array_header(fp, version)[2]
assert dtype.hasobject
print(RenamingUnpickler(fp).load())

关于python - 重命名模块后 Unpickling 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40914066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com