У меня есть словарь, подобный классу, который я использую для хранения некоторых значений как атрибутов. Недавно я добавил логику ( __ 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.