详细说明
在跑网上代码的时候出现了这个错误
PicklingError: args[0] from __newobj__ args has the wrong class
用了很长时间终于解决该问题,下面详细说一下。
由于跑的代码是几年前的老代码了,当时原作者使用的是python2.x版本。我则依旧使用python3.x。代码的转换也是用了一个下午,后来才发现,python自带转换方法。如下
2to3 -w ***.py
但是转换也只能转换一些简单地基础的语法问题,比如print,所以后续也一直磕磕绊绊的改代码来跑。
出现错误的时候大概也知道是py2和py3不兼容的问题,在国外社区发现了类似问题,根源大概是因为
python3中的pickle.dumps,它返回字节,而在python2中,它返回str。
后来也证实该问题在py2.7下该错误不存在,而py3下存在该错误。
错误定位
tensorflow内置的preprocessing.VocabularyProcesso函数
一般我们在进行文本处理时,需要写方法建立词汇表和word到idx,以及idx到word的映射关系,这就需要统计词汇表中的所有单词并建立相应的词典。
问题解决
将self去掉。
该文件通常在你的项目里面被命名为preprocess.py
,可以参考下面这个找到对应位置,进行修改。
需要注意的类似问题
TypeError: a bytes-like object is required, not ‘str’
报错原因:
python3和Python2在套接字返回值解码上有区别。可以使用encode(),decode()做切换
- str通过encode()方法可以编码为指定的bytes;
- 把bytes变为str,就需要用decode()方法;