Python shelve错误-声明NoneType,但对象*is*在那里



我刚刚碰到了一个非常奇怪的错误。我将选择的内容保存到一个文件中。其中一个是一个叫做Tracker的类的版本,这个副本叫做Tracker。

        file = shelve.open(worldname, 'n')
        file['Terramap'] = terramap
        file['Satmap'] = satmap
        file['Gasmap'] = gasmap
        file['Planetset'] = planetset
        file['World'] = minimap
        file['Picture'] = picturemap                                    
        file['Worlddata'] = worlddata
        file['Dimension'] = dimension
        print "check", len(tracker.families)
        file['Tracker'] = tracker
        file['Schedule'] = schedule
        file['Time'] = time
        file.close()      

如果我让它在文件之前从跟踪器打印一些东西,纯粹是为了测试跟踪器仍然存在,它确实可以检测到跟踪器。但是在一行之后,它出现了:

  File "C:UsersMarkDesktopUltima Ratio RegumURR0-2-1.py", line 17522, in world_menu
    file['Tracker'] = tracker
  File "C:Python27libshelve.py", line 132, in __setitem__
    p.dump(value)
TypeError: expected string or Unicode object, NoneType found

我只是…难住了。以前从未发生过这种事,我不明白这怎么可能!有人能解释一下吗?我今天所做的就是向tracker添加一些东西,但tracker只存储字符串列表,最多几千个,仅此而已。但是,如果我让它在保存开始之前创建一个新的跟踪器,它就会保存得很好。

编辑:

运行pickle.dumps(tracker)显示:

  File "C:UsersMarkDesktopUltima Ratio Regum29-12-test.py", line 17515, in world_menu
    pickle.dumps(tracker)
  File "C:Python27libpickle.py", line 1374, in dumps
    Pickler(file, protocol).dump(obj)
  File "C:Python27libpickle.py", line 224, in dump
    self.save(obj)
  File "C:Python27libpickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:Python27libpickle.py", line 725, in save_inst
    save(stuff)
  File "C:Python27libpickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:Python27libpickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:Python27libpickle.py", line 663, in _batch_setitems
    save(v)
  File "C:Python27libpickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:Python27libpickle.py", line 600, in save_list
    self._batch_appends(iter(obj))
  File "C:Python27libpickle.py", line 615, in _batch_appends
    save(x)
  File "C:Python27libpickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:Python27libpickle.py", line 725, in save_inst
    save(stuff)
  File "C:Python27libpickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:Python27libpickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:Python27libpickle.py", line 663, in _batch_setitems
    save(v)
  File "C:Python27libpickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:Python27libpickle.py", line 748, in save_global
    (obj, module, name))
PicklingError: Can't pickle <built-in method capitalize of str object at 0x0A1341C0>: it's not found as __main__.capitalize

该异常来自cPickle.Pickler.dump的内部,但它没有出现在追溯中,因为它在编译的C模块中。要获得错误的指示,请尝试手动触发相同的事情,但使用纯python pickle模块而不是编译的C cPickle模块:

import pickle
pickle.dumps(tracker)

这将显示错误的位置。我的第一个猜测是,您的__reduce_ex____reduce__的实现不返回值。

相关内容

最新更新