为什么@contextmanager 只用于自包含函数?

Why is @contextmanager used only for self-contained functions?

我正在阅读 Python 食谱,其中提到了以下内容:

@contextmanager is really only used for writing self-contained context-management functions. If you have some object (e.g. a file, network connection, or lock) that needs to support the with statement, you still need to implement the __enter and __exit__ methods separately.

这个我不太明白。为什么我们不能使用具有上下文管理功能的文件对象?用 @contextmanager 装饰的函数不等同于 类 和 __enter____exit__ 方法吗?

假设你有一个 class:

class DatabaseCursor(object):
    ...

并且您想为其添加上下文管理器功能。你会把 @contextmanager 放在哪里?

这里没有:

@contextmanager
class DatabaseCursor(object):
    ...

这里没有:

class DatabaseCursor(object):
    @contextmanager
    def __init__(self, ...):
        ...

这里没有:

class DatabaseCursor(object):
    @contextmanager
    def __enter__(self):
        ...

无处可去,真的。 @contextmanager 无法帮助您将上下文管理器功能添加到现有 classes。您甚至不能使用 @contextmanager 装饰函数作为基础 classes,因为实现实际上并没有创建 class。如果你想让你的类文件对象或数据库游标或网络连接或其他可关闭资源支持用作上下文管理器,你必须直接实现 __enter____exit__