4

これについて多くのスレッドを見つけましたが、それらすべての問題は名前空間です。私の問題は名前空間とは何の関係もありません。

小さな例:

import cPickle as pickle
from uncertainties import Variable

class value(Variable):
    def __init__(self, args, showing=False):
        self.show = showing
        Variable.__init__(self, args[0], args[1])

val = value((3,1), True)
print val.nominal_value, val.std_dev(), val.show
fobj = file("pickle.file", "w")
pickle.dump(val, fobj)
fobj.close()

fobj = file("pickle.file", "r")
val = pickle.load(fobj)
fobj.close()
print val.nominal_value, val.std_dev(), val.show

このコードの出力:

3.0 1.0 True
3.0 1.0
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
    173             else:
    174                 filename = fname
--> 175             __builtin__.execfile(filename, *where)

/home/markus/pickle.py in <module>()
     19 val = pickle.load(fobj)
     20 fobj.close()
---> 21 print val.nominal_value, val.std_dev(), val.show

AttributeError: 'value' object has no attribute 'show'

名前空間は、ピッキングとアンピクルで同じです。のすべての属性uncertainties.Variableが復元されます。追加した「ショー」のみが失われます。

4

1 に答える 1

6

このuncertainties.Variable()クラス__slots__属性を使用してメモリを節約します。その結果、pickle 可能にするには、メソッドも定義する必要があります(オブジェクトを pickle しようとすると、__slots__ を定義しているクラスについてエラーが発生するのはなぜですか? を参照してください)。__getstate__

独自の属性を追加する必要がある場合は、その__getstate__メソッドをオーバーライドする必要があります。独自の属性で追加の属性を宣言すること__slot__も、おそらく良い考えです。

from uncertainties import Variable

class value(Variable):
    __slots__ = ('show',)  # only list *additional* slots

    def __init__(self, args, showing=False):
        self.show = showing
        super(value, self).__init__(args[0], args[1])

    def __getstate__(self):
        obj_slot_values = {}
        for cls in type(self).mro():
            obj_slot_values.update((k, getattr(self, k)) for k in getattr(cls, '__slots__', ()))
        # Conversion to a usual dictionary:
        return obj_slot_values

MRO 内の各クラスには代わりに属性が 1 つある可能性がありますが、このメソッドは属性が1 つしかないことを前提としているため、この新規__getstate__が必要です。Variable.__getstate__ __slots__

これは実際にはuncertaintiesライブラリの制限です。これに対処し、サブクラスでメソッドをオーバーライドする必要をなくすプル リクエストを送信しました。__getstate__

于 2013-02-27T16:56:54.207 に答える