Python 如何定位有问题(不可拾取)的对象?
尝试pickle对象时,我收到以下错误消息:Python 如何定位有问题(不可拾取)的对象?,python,pickle,Python,Pickle,尝试pickle对象时,我收到以下错误消息: TypeError: cannot serialize '_io.TextIOWrapper' object 有问题的对象类继承了另一个类(pytorch_lightning.LightningModule),因此我假设有问题的对象属于超类。我怎样才能找到它?错误跟踪只指向我的pickling命令,它是 with open(save_path, "wb") as p: pickle.dump(self, p) 根据,您可以通过定义函数来影
TypeError: cannot serialize '_io.TextIOWrapper' object
有问题的对象类继承了另一个类(pytorch_lightning.LightningModule),因此我假设有问题的对象属于超类。我怎样才能找到它?错误跟踪只指向我的pickling命令,它是
with open(save_path, "wb") as p:
pickle.dump(self, p)
根据,您可以通过定义函数来影响对象的酸洗方式
类可以进一步影响其实例的酸洗方式;如果
类定义方法\uuuu getstate\uuuu()
,调用该方法并返回
对象作为实例的内容而不是
实例字典的内容。如果\uuu getstate\uuu()
方法是
如果不存在,则实例的\uuuuu dict\uuuu
会像往常一样进行酸洗
尝试执行以下操作:
def __getstate__(self):
for variable_name, value in vars(self).items():
try:
pickle.dumps(value)
expect:
print('{variable_name} with value {value} is not pickable')
当您尝试pickle对象时,它应该打印出对象的不可拾取对象
替代方法:
如果\uuu getstate\uuu()
方法是
如果不存在,则实例的\uuuuu dict\uuuu
会像往常一样进行酸洗
用同样的方法检查对象
\uuuu dict\uuuu
,尝试对每个变量进行pickle处理,找出有问题的变量。Nice。递归扩展应该非常容易,以便准确地找出有问题的对象在层次结构中的位置。虽然我觉得pickle过程本身应该做到这一点,但我认为您不需要“递归地扩展它”,因为vars()
为您提供了对象\uuu dict\uu
,其中也包含所有的超类变量。是的,但是,如果有问题的变量属于属于另一个对象的对象,而另一个对象。。。哪个属于超级阶级?在某些情况下,如果inspect
可以帮助您,那么最好知道它的确切位置。使用inspect.getmro
获取对象从中继承的所有类,并使用inspect.getclosurevars
获取所有继承的类\uuu init\uuu
变量。