代码之家  ›  专栏  ›  技术社区  ›  blues

在init中使用contextmanager

  •  0
  • blues  · 技术社区  · 7 年前

    with super().__init__(*args, **kwargs): MyFileIO2中的行抛出了一个关于缺少的错误 __exit__

    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')
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   cs95 abhishek58g    7 年前

    您需要在上调用上下文管理器 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
    

    为了进行测试,我创建了一个二进制文件,其内容为“helloworld”。

    _ = MyFileIO2(path, 'rb')    
    # First byte of file:  b'h'
    

    super().__init__ 正在通过上下文管理器传递,因此您实际上有:

    with None:
         pass
    
    AttributeError: __enter__
    

    上下文管理器尝试调用 __enter__ 关于 NoneType 对象,但该操作无效。

    推荐文章