私はいくつかの値を属性として保存するためのクラスのような辞書を持っています。私は最近、属性が存在しない場合、Noneを返すようなロジック(__getattr__
)を追加しました。すぐに私はこのピクルスが墜落したのですが、なぜ私はいくつかの洞察を求めていました。__getattr__のデフォルト値を返そうとすると、Python pickleクラッシュが発生する
テストコード:
import cPickle
class DictionaryLike(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def __iter__(self):
return iter(self.__dict__)
def __getitem__(self, key):
if(self.__dict__.has_key(key)):
return self.__dict__[key]
else:
return None
''' This is the culprit...'''
def __getattr__(self, key):
print 'Retreiving Value ' , key
return self.__getitem__(key)
class SomeClass(object):
def __init__(self, kwargs={}):
self.args = DictionaryLike(**kwargs)
someClass = SomeClass()
content = cPickle.dumps(someClass,-1)
print content
結果:私は愚かな何かを
Retreiving Value __getnewargs__
Traceback (most recent call last):
File <<file>> line 29, in <module>
content = cPickle.dumps(someClass,-1)
TypeError: 'NoneType' object is not callable`
をしましたか? deepcopy()がキーが存在しない場合に例外をスローする必要があるかもしれない投稿を読んでいましたか?この場合、例外をスローせずに私が望むものを達成するための簡単な方法はありますか?
最終結果は、いくつかのコール
someClass.args.i_dont_exist
が、私はそれがNoneを返したい場合ということです。
これは私の場合には最適かもしれないと思う。_と\ _ \ _は決して属性名ではないからだ。 – Nix
これは本当に賢いです私はそれを行うことを考えたことがない – GWW
あなたはここで私をとても救ったよ – Greg