属性Dict - 获取文档时引发的TypeError

时间:2014-08-26 14:19:55

标签: python-2.7 keyerror

我在Alchin' pro python'中写了一个"属性和类似对象? book,(下面几乎直接来自本书。我的目标是创建一个配置对象,其中配置字段可作为类属性访问)。

class ADict(dict):
    def __setattr__(self,key,value):
        self[key] = value
    def __getattr__(self,key):
        return self[key]

当我尝试访问文档时,我得到一个与错误的__name__属性相关的TypeError(下面的示例)。

>>> z = ADict()
>>> help(z)
line 1531, in doc
pager(render_doc(thing, title, forceload))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pydoc.py",   line 1505, in render_doc
object, name = resolve(thing, forceload)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pydoc.py", line 1500, in resolve
name = getattr(thing, '__name__', None)
File "attributeConfig.py", line 26, in __getattr__
return self[key]
KeyError: '__name__'

这里发生了什么?对于我来说这个__name__的位置(以及它在pydoc代码中的使用方式)并不明显。

1 个答案:

答案 0 :(得分:0)

当找不到属性时,您需要确保引发AttributeError

class ADict(dict):

    def __setattr__(self,key,value):
        self[key] = value

    def __getattr__(self,key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError

这将首先在字典中查找属性。如果它在那里,返回它。否则,使用引发AttributeError表示该属性不在那里。