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

Python 2.7 属性Dict--获取文档时引发的TypeError,python-2.7,keyerror,Python 2.7,Keyerror,我从Alchin‘pro python’一书中写了一个类似于“AttributeDict”的对象(下面几乎是直接从书中摘取的。我的目标是创建一个配置对象,其中配置字段可以作为类属性访问) 当我试图访问文档时,我得到了一个TypeError,它与缺少的_name___属性有关(下面的示例) 这是怎么回事?对于我来说,这个名称的去向(以及它在pydoc代码中的使用方式)并不明显。您需要确保在找不到属性时引发一个AttributeError: class ADict(dict): def _

我从Alchin‘pro python’一书中写了一个类似于“AttributeDict”的对象(下面几乎是直接从书中摘取的。我的目标是创建一个配置对象,其中配置字段可以作为类属性访问)

当我试图访问文档时,我得到了一个TypeError,它与缺少的_name___属性有关(下面的示例)


这是怎么回事?对于我来说,这个名称的去向(以及它在pydoc代码中的使用方式)并不明显。

您需要确保在找不到属性时引发一个
AttributeError

class ADict(dict):

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

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

这将首先在字典中查找属性。如果它在那里,就把它还给我。否则,使用raise一个
AttributeError
来表示该属性不在那里。

您将调用什么
z=ADict()
而不是:
z.。\uuuuu name\uuuuuu
您将得到
AttributeError:'super'对象没有属性'\uu getattr\uuuuuu'
@ambi现已修复,该方法应改为引发一个
AttributeError
。@SimeonVisser好的,谢谢。这项工作。缺少的_uname _uu属性一开始是怎么处理的?(我不熟悉python中的神奇方法,因此如果这是非常明显的,我很抱歉)。@user1151034:我认为当您调用
help()
时,它会尽可能多地收集有关对象的信息,包括
\uu name\uuu
属性。如果没有,也可以,但是在本例中,缺少的属性没有被类正确处理。如果名称在那里,我想它会显示在“帮助详细信息”中。@user1151034:通常,您可以对任何内容调用
help()
,也可以手动删除
\u name\u
属性。因此,
help()
可以查找根本不存在的内容。无法保证属性会在那里(如图所示),但
help()
仍会尝试查看它是否可以在那里检索信息。
>>> 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__'
class ADict(dict):

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

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