为什么@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__
。
我正在阅读 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 thewith
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__
。