【发布时间】:2011-06-20 18:51:13
【问题描述】:
我有一个类字典,我用它来存储一些值作为属性。我最近添加了一些逻辑(__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
我希望它返回无。
【问题讨论】:
标签: python python-2.7 pickle