Python 接收AttributeError:_退出_,即使WITH object已定义退出

Python 接收AttributeError:_退出_,即使WITH object已定义退出,python,python-3.x,Python,Python 3.x,在用完成部分后,我在下面的代码中收到一个错误AttributeError:\uu exit\uuu。元素对象已在中以返回,并且已定义了\uuuu退出,因此我感到困惑 class Builder: def __init__(self): print("Builder init fires") def __getattr__(self, name): return Element(name, self) class Element: def

在用完成
部分后,我在下面的代码中收到一个错误
AttributeError:\uu exit\uuu
。元素对象已在
中以
返回,并且已定义了
\uuuu退出
,因此我感到困惑

class Builder:
    def __init__(self):
        print("Builder init fires")

    def __getattr__(self, name):
        return Element(name, self)

class Element:
    def __init__(self, name, builder):
        self.name = name
        self.builder = builder
        print("Element init fires for name of", self.name)
    def __call__(*args, **kargs):
        print("CALL fires, now with attributes listed:")
        for attr, value in sorted(kargs.items()):
            print(' %s=>%s' % (attr, value))

    def __enter__(self):  
        return self

    def __exit__(self, type, value, traceback): 
        pass

aa = Builder()        
with aa.feed(xmlns='http://www.w3.org/2005/Atom'):
    print("INSIDE THE WITH")

带有
关键字的
之后的表达式值必须是有效的上下文管理器。这意味着表达式的值必须具有属性
\uuuuuuu进入
\uuuuuu退出,并且这些属性必须接受文档中描述的参数。您可以轻松地验证part
aa.feed
是否可以接受,但整个表达式的值为
None
,并且没有必要的属性。Python3.5和3.6之间的一个区别是,一个在缺少
\uuuuuuuuuuuuuuuuuuuuuu
时失败,而后者在缺少
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。没什么意外


您还忘记了
self
行中的
def\uuuu调用(self,*args,**kargs):
如果您使用args,这将是一个问题,而且它也是一个pythonic模式,也有未使用的args。

当我运行代码时,我得到
的AttributeError enter\uu
,因为您的
\uuuu调用
没有返回任何值。在Python3.5.2下,它似乎接收到
\uuuu退出
属性错误,但在Python3.6.1下,它的
\uuu输入
。我看你是对的,
\uu call\uu()
确定
返回的内容,它需要
返回self
。谢谢。与缺少参数类似,完全省略params和()将引发相同的异常。例如:
带aa.feed: