【问题标题】:pickle python Class instance泡菜python类实例
【发布时间】:2012-04-24 23:54:46
【问题描述】:

我有一个简单的类来存储与电路板相关的数据,如下所示:

class boardClass():

    def __init__(self,boardName):
        self.__name=boardName
        self.__boardMappings= {boardName:{
                                  'FastMode':
                                  {'CPU_A':{'mipi':[], 'gpen':[]},
                                   'CPU_B':{'mipi':[], 'gpen':[]}

                                  'SlowMode':
                                  {'CPU_A':{'mipi':[], 'gpen':[]},
                                   'CPU_B':{'mipi':[], 'gpen':[]}                                   
                                  }
                                 }                       
                               }


    def setMode(self, board, mode, cpu,mipi,gpen):
        self.__boardMappings[board][mode][cpu]['mipi']=mipi
        self.__boardMappings[board][mode][cpu]['gpen']=gpen

    def getName(self):
        return self.__name

我在另一个类中使用 pickle 将 boardClass 数据存储在文件中,然后读取它们:

def onSave(self,boardName):
        board=boardClass.boardClass(boardName)
        name=boardName+".brd"
        file=open(name,"wb")            
        pickle.dump(board,file)                        
        loadedBoard= pickle.load( open( file, "rb" ))            
        print "Loaded board name is : ",loadedBoard.getName()

当我调用onSave() 方法来腌制boardClass 时,它给出了几个以这个结尾的错误:

File "C:\Python27\lib\copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle PySwigObject objects

这个boardClass 是一个非常简单的容器。为什么不能腌制?

【问题讨论】:

  • PEP 8 希望您将您的班级命名为 Board(不是 BoardClass,因为您知道这是一个班级)、setMode set_mode 等。还有冒号后的空格分配中= 周围的字典文字和空格。最后,你应该 class Board(object) 让它成为一个新式的类。
  • 您的代码没有意义。 onSave 定义在哪个类中? boardNameonSave 中定义在哪里? PySwigObject 来自哪里(显然您在董事会中做的比您展示的要多)?
  • Chris,onSave() 在另一个类中定义的位置无关紧要,当用户想要保存电路板时会调用它。(或腌制它的代码)我不知道在哪里PySwigObject 来自我的代码中没有它,而对于泡菜部分,这就是所有代码。做类 Board(object) 也没有解决任何问题。
  • 好吧,有了你得到的代码,它就可以工作了。 (试试看。)您在某个地方还有其他重要的代码没有显示。我的第一条评论(几乎)纯粹是关于文体问题。除了新样式的类位(它将修复一些不知名的地方的奇怪行为),它不会改变任何功能。
  • 可腌制是通过新样式类修复的“奇怪行为”的一部分。

标签: python pickle


【解决方案1】:

不是从“无”继承,而是从“对象”继承 - 这样,您的班级将不再是“班级实例”-它将是 新式类的适当实例,因此是“可挑选的”

换句话说,只需尝试更改此行:

class boardClass():

到这里:

class boardClass(object):

更新:这个答案来自 Python 2 时代 - 并且需要从对象显式继承。在 Python 3 中不再是这种情况:从 object 继承是自动的,如果 pickle 失败是由于其他原因。

【讨论】:

    【解决方案2】:

    如果您真的想保留您的对象,使其在参数中不包含“对象”,您可以使用像dillcloudpickle 这样的序列化程序,它可以序列化旧式和新式类实例(对于 python 2.x 和 3.x 语法)。

    【讨论】:

      【解决方案3】:

      你不能腌制PySwigObjects,但是这里有一个解决方法:Pickling objects

      【讨论】:

        【解决方案4】:

        这是一个老问题,而且名字很笼统,所以如果你现在看到它,你可能想设置你的类的__getstate____setstate__,这样pickle 就会知道如何转储和加载你定义的类。

        在此处查看examples

        如果你的类很简单(例如,只有整数和字符串作为成员和任何方法),它应该可以自动选择。

        【讨论】:

          猜你喜欢
          • 2019-06-15
          • 1970-01-01
          • 1970-01-01
          • 2017-11-09
          • 2013-09-22
          • 1970-01-01
          • 1970-01-01
          • 2016-01-02
          • 2012-05-04
          相关资源
          最近更新 更多