gpt4 book ai didi

python - 上下文管理器反向

转载 作者:行者123 更新时间:2023-11-28 21:49:04 25 4
gpt4 key购买 nike

我的 Python 处于中级水平,最近我一直在研究 Python 上下文管理器。我想颠倒进入和退出的运行顺序。所以我写了这个上下文管理器:

class ReversibleContextManager(object):

def __enter__(self, *args):
print('d')
return self

def __exit__(self, *args):
print('g')
return self

def __invert__(self):
self.__enter__, self.__exit__ = self.__exit__, self.__enter__
return self

它工作得很好:

with ContextManager():
print('o')

d
o
g

但反过来,我们仍然得到:

with ~ContextManager():
print('a')

d
o
g

如果我们按预期显式调用 enter 和 exit 函数,我们会得到:

with ReversibleContextManager() as c:
c.__enter__()
print('o')
c.__exit__()

d
d
o
g
g

但是实例方法的顺序是相反的!

with ~ReversibleContextManager() as c:
c.__enter__()
print('o')
c.__exit__()

d
g
o
d
g

所以看起来 with 语句调用使用绑定(bind)到类的方法而不是实例(这是正确的术语吗?)。这是预期的吗?

所谓的是:

c = ReversibleContextManager()
c.__invert__()
ReversibleContextManager.__enter__(c)
...in context...
ReversibleContextManager.__exit__(c)

而不是我所期望的:

c = ReversibleContextManager()
c.__invert__()
c.__enter__()
...in context...
c.__exit__()

最佳答案

So it looks like the with statement calls using the method bound to the Class rather than the instance (is this the right terminology?). Is this expected?

当然。这就是 Python 通常查找特殊方法的方式。如果你有一个类 Foo 实现了 __str__print Foo 调用 type(Foo).__str__ 而不是 Foo.__str__

关于python - 上下文管理器反向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34076441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com