这是我今天在http://filmaster.com"> filmaster.com上遇到的错误:
PicklingError:不能pickle:它与decimal.Decimal不是同一个对象
这究竟意味着什么?它似乎没有多大意义......它似乎与django缓存有关.你可以在这里看到整个追溯:
Traceback(最近一次调用最后一次):
文件"/home/filmaster/django-trunk/django/core/handlers/base.py",第92行,在get_response response = callback(request,*callback_args,**callback_kwargs)
在show_film
workflow.set_data_for_authenticated_user()中输入文件"/home/filmaster/film20/film20/core/film_views.py",第193行文件"/home/filmaster/film20/film20/core/film_views.py",第518行,在set_data_for_authenticated_user
object_id = self.the_film.parent.id)在get_others_ratings
set_cache 中输入文件"/home/filmaster/film20/film20/core/film_helper.py",第179行(CACHE_OTHERS_RATINGS,str(object_id)+"_"+ str(user_id),userratings)文件"/home/filmaster/film20/film20/utils/cache_helper.py",第80行,在set_cache中返回cache.set(CACHE_MIDDLEWARE_KEY_PREFIX + full_path,result,get_time(cache_string))
文件"/home/filmaster/django-trunk/django/core/cache/backends/memcached.py",第37行,设置为
self._cache.set(smart_str(key),value,timeout或self.default_timeout)文件"/usr/lib/python2.5/site-packages/cmemcache.py",第128行,在set val中,flags = self._convert(val)
文件"/usr/lib/python2.5/site-packages/cmemcache.py",第112行,在_convert val = pickle.dumps(val,2)
PicklingError:不能pickle:它与decimal.Decimal不是同一个对象
Filmaster的源代码可以从这里下载:bitbucket.org/filmaster/filmaster-test
任何帮助将不胜感激.
在jupyter笔记本中运行时出现此错误.我认为问题在于我正在使用%load_ext autoreload
autoreload 2
.重新启动我的内核并重新运行解决了这个问题.
Pickle的一个奇怪之处在于,在你挑选其中一个实例之前导入类的方式可以巧妙地改变pickle对象.Pickle要求你在腌制它之前和取消它之前相同地导入对象.
例如:
from a.b import c C = c() pickler.dump(C)
将制作一个微妙的不同对象(有时):
from a import b C = b.c() pickler.dump(C)
尝试摆弄你的导入,它可能会纠正这个问题.
我将用Python2.7中的简单Python类演示问题:
In [13]: class A: pass In [14]: class B: pass In [15]: A Out[15]:In [16]: B Out[16]: In [17]: A.__name__ = "B" In [18]: pickle.dumps(A) --------------------------------------------------------------------------- PicklingError: Can't pickle : it's not the same object as __main__.B
显示此错误的原因是我们试图转储A,但是由于我们将其名称更改为引用另一个对象“ B”,因此,泡菜实际上与要转储的对象-类A或B混淆。显然,泡菜人非常聪明,他们已经对此行为进行了检查。
解决方案:检查您要转储的对象是否与另一个对象具有冲突的名称。
我已经在下面用ipython和ipdb演示了上述情况的调试:
PicklingError: Can't pickle: it's not the same object as __main__.B In [19]: debug > / /pickle.py(789)save_global() 787 raise PicklingError( 788 "Can't pickle %r: it's not the same object as %s.%s" % --> 789 (obj, module, name)) 790 791 if self.proto >= 2: ipdb> pp (obj, module, name) **<------------- you are trying to dump obj which is class A from the pickle.dumps(A) call.** ( , '__main__', 'B') ipdb> getattr(sys.modules[module], name) **<------------- this is the conflicting definition in the module (__main__ here) with same name ('B' here).**
我希望这可以节省一些麻烦!阿迪奥斯!