74

これは、今日 <a href"http://filmmaster.com">filmmaster.com で表示されたエラーです:

PicklingError: Can't pickle <class
'decimal.Decimal'>: it's not the same
object as decimal.Decimal

それは正確にはどういう意味ですか?あまり意味がないようです... djangoキャッシングに関連しているようです。ここでトレースバック全体を確認できます。

Traceback (most recent call last):

 File
"/home/filmaster/django-trunk/django/core/handlers/base.py",
line 92, in get_response    response =
callback(request, *callback_args,
**callback_kwargs)

 File
"/home/filmaster/film20/film20/core/film_views.py",
line 193, in show_film   
workflow.set_data_for_authenticated_user()

 File
"/home/filmaster/film20/film20/core/film_views.py",
line 518, in
set_data_for_authenticated_user   
object_id = self.the_film.parent.id)

 File
"/home/filmaster/film20/film20/core/film_helper.py",
line 179, in get_others_ratings   
set_cache(CACHE_OTHERS_RATINGS,
str(object_id) + "_" + str(user_id),
userratings)

 File
"/home/filmaster/film20/film20/utils/cache_helper.py",
line 80, in set_cache    return
cache.set(CACHE_MIDDLEWARE_KEY_PREFIX
+ full_path, result, get_time(cache_string))

 File
"/home/filmaster/django-trunk/django/core/cache/backends/memcached.py",
line 37, in set   
self._cache.set(smart_str(key), value,
timeout or self.default_timeout)

 File
"/usr/lib/python2.5/site-packages/cmemcache.py",
line 128, in set    val, flags =
self._convert(val)

 File
"/usr/lib/python2.5/site-packages/cmemcache.py",
line 112, in _convert    val =
pickle.dumps(val, 2)

PicklingError: Can't pickle <class
'decimal.Decimal'>: it's not the same
object as decimal.Decimal

また、Filmaster のソース コードは、bitbucket.org/filmmaster/ filmmaster-testからダウンロードできます。

どんな助けでも大歓迎です。

4

12 に答える 12

95

jupyter ノートブックで実行しているときにこのエラーが発生しました。問題は、私が使用していたことだと思います%load_ext autoreload autoreload 2。カーネルを再起動して再実行すると、問題が解決しました。

于 2016-07-24T11:46:51.270 に答える
32

Pickle の奇妙な点の 1 つは、クラスのインスタンスの 1 つをピクルする前にクラスをインポートする方法によって、ピクルされたオブジェクトが微妙に変更される可能性があることです。Pickle では、オブジェクトを pickle する前と unpickle する前の両方で同じようにインポートする必要があります。

たとえば、次のようになります。

from a.b import c
C = c()
pickler.dump(C)

微妙に異なるオブジェクトを (場合によっては) 以下に作成します。

from a import b
C = b.c()
pickler.dump(C)

インポートをいじってみてください。問題が解決する場合があります。

于 2009-09-11T21:12:22.473 に答える
7

どういうわけかreload(decimal)、またはdecimalクラスを変更するためにdecimalモジュールにモンキーパッチを適用しましたか?これらは、そのような問題を引き起こす可能性が最も高い2つのことです。

于 2009-12-27T01:57:05.727 に答える
1

デバッグ中に同じ問題が発生しました(Spyder)。プログラムを実行すると、すべてが正常に機能しました。しかし、デバッグを開始すると、picklingError に直面しました。

しかし、ファイルごとの実行構成 (ショートカット: ctrl+F6)で専用コンソールで実行するオプションを選択すると、すべてが期待どおりに正常に機能しました。どのように適応しているのか正確にはわかりません。

注:私のスクリプトには、次のような多くのインポートがあります

from PyQt5.QtWidgets import *
from PyQt5.Qt import *
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import os, sys, re, math

私の基本的な理解は、星 (*) のおかげで、この picklingError が発生していたということでした。

于 2020-02-12T11:29:54.560 に答える