在完成 with
部分后,我在下面的代码中收到了 AttributeError: __exit__
错误。 Element 对象在 with
中返回,并且定义了 __exit__
,所以我很困惑。
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")
最佳答案
with
关键字后的表达式值必须是有效的上下文管理器。这意味着表达式的 value 必须具有属性 __enter__
和 __exit__
并且这些必须接受文档中描述的参数 With Statement Context Managers .您可以轻松验证 aa.feed
部分是否可以接受,但整个表达式的值为 None
并且它没有必要的属性。 Python 3.5 和 3.6 之间的区别在于,一个在缺少 __exit__
时失败,而后者在缺少 __enter__
时失败。没有意外。
您还忘记了 def __call__(self, *args, **kargs):
行中的 self
如果您将使用 args,那将是一个问题,它是一个 pythonic 模式也有未使用的参数。
关于python - 接收属性错误 : __exit__ even when WITH object has EXIT defined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45901265/