gpt4 book ai didi

python - 接收属性错误 : __exit__ even when WITH object has EXIT defined

转载 作者:行者123 更新时间:2023-11-28 18:19:50 25 4
gpt4 key购买 nike

在完成 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com