为了账号安全,请及时绑定邮箱和手机立即绑定

在 init 中使用 contextmanager

在 init 中使用 contextmanager

拉风的咖菲猫 2021-09-24 15:21:22
在下面的代码中,我不明白为什么with super().__init__(*args, **kwargs):MyFileIO2 中的行会抛出一个关于丢失的错误,__exit__而 MyFileIO 类一切正常。我真的不明白在 init 内部或外部执行 with 之间究竟有什么区别。有人可以启发我这里发生了什么吗?import ioclass MyFileIO(io.FileIO):    def __init__(self, *args, **kwargs):        super().__init__(*args, **kwargs)    def __enter__(self, *args, **kwargs):        f = super().__enter__(*args, **kwargs)        print('first byte of file: ', f.read(1))        return fclass MyFileIO2(io.FileIO):    def __enter__(self, *args, **kwargs):        f = super().__enter__(*args, **kwargs)        print('first byte of file: ', f.read(1))        return f    def __init__(self, *args, **kwargs):        with super().__init__(*args, **kwargs): # AttributeError: __exit__            passpath = 'some_file.bin'with MyFileIO(path, 'rb'):    passMyFileIO2(path, 'rb')
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

您将需要在 上调用上下文管理器self,因为__init__实际上不会返回任何内容。


class MyFileIO2(io.FileIO):

    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)

        with self:

             pass


    def __enter__(self, *args, **kwargs):

        f = super().__enter__(*args, **kwargs)

        print('First byte of file: ', f.read(1))

        return f

为了测试,我创建了一个内容为“hello world”的二进制文件。


_ = MyFileIO2(path, 'rb')    

# First byte of file:  b'h'

发生的事情是super().__init__通过上下文管理器传递的返回值,因此您有效地拥有:


with None:

     pass


AttributeError: __enter__

上下文管理器尝试调用对象__enter__上的方法NoneType,但这是一个无效的操作。


查看完整回答
反对 回复 2021-09-24
  • 1 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信