I have a dictionary like class that I use to store some values as attributes. I recently added some logic(__getattr__
) to return None if an attribute doesn't exist. As soon as I did this pickle crashed, and I wanted some insight into why?
Test Code:
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 ' , keyreturn self.__getitem__(key)class SomeClass(object):def __init__(self, kwargs={}):self.args = DictionaryLike(**kwargs)someClass = SomeClass()
content = cPickle.dumps(someClass,-1)
print content
Result:
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`
Did I do something stupid? I had read a post that deepcopy() might require that I throw an exception if a key doesn't exist? If this is the case is there any easy way to achieve what I want without throwing an exception?
End result is that if some calls
someClass.args.i_dont_exist
I want it to return None.