У меня есть словарь, как класс, который я использую для хранения некоторых значений в качестве атрибутов. Недавно я добавил логику (__getattr__
), чтобы вернуть None, если атрибут не существует. Как только я сделал это, рассол рухнул, и я хотел понять почему?
Тестовый код:
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.