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

标签 python python-3.x

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

相关文章:

Python list of lists true 中的所有项目

python - 在python中计算频率时忽略一条线

Python3 C 库的使用

python - 从需要用户输入的 python 运行 linux 命令

python - 对给定列的 numpy 矩阵进行排序

python-3.x - 如何通过点文件可视化 Pyfst 传感器

python - 如何使用 "{foo} {bar} {baz}"等命名占位符动态检查格式字符串

python - 使用 PIL 和请求下载图像

python - 添加 2 个不同长度的列表列表

python - 从 GML 文件中提取数据