Ошибка рассола Python при попытке вернуть значение по умолчанию в __getattr __

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

6
задан Nix 20 June 2011 в 18:58
поделиться