首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在init中使用contextmanager

在init中使用contextmanager
EN

Stack Overflow用户
提问于 2018-12-24 16:27:14
回答 1查看 598关注 0票数 0

在下面的代码中,我不明白为什么MyFileIO2中的MyFileIO2行会抛出一个关于缺少__exit__的错误,而MyFileIO类的所有操作都很好。我真的不明白用init的内部或外部来做到底有什么区别。有人能告诉我这是怎么回事吗?

代码语言:javascript
复制
import io

class 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 f

class 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__
            pass

path = 'some_file.bin'

with MyFileIO(path, 'rb'):
    pass

MyFileIO2(path, 'rb')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-24 16:34:48

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

代码语言:javascript
复制
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“。

代码语言:javascript
复制
_ = MyFileIO2(path, 'rb')    
# First byte of file:  b'h'

所发生的情况是super().__init__的返回值正通过上下文管理器传递,因此您实际上拥有以下内容:

代码语言:javascript
复制
with None:
     pass

AttributeError: __enter__

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53915733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档