如果构建和销毁上下文很重,我如何检测到我已经有了上下文,并且不需要再次构建它?换句话说,我希望嵌套上下文2什么也不做。你知道吗
我可能需要在一个循环中多次调用上下文,是否可以将整个循环放在with
子句中,然后不知何故,循环中的上下文知道它们已经在一个上下文中,然后跳过构建上下文,就好像内部with
子句没有效果一样?(在下面的示例中,我想完全跳过上下文2)
from contextlib import contextmanager
@contextmanager
def myContext(i):
print 'build context', i
try:
yield
finally:
print 'exiting context',i
def func():
print 'call func'
with myContext(1):
print 'outside'
with myContext(2):
func()
代码输出:
build context 1
outside
build context 2
call func
exiting context 2
exiting context 1
我使用元类将@Blckknght的答案与Creating a singleton in Python中的Method 3结合起来。你知道吗
以及输出
您可以创建全局引用计数:
(请注意,这不是线程安全的,但程序是单线程的并不重要。)
使用作为单例的上下文管理器类,而不是在函数上使用
contextmanager
修饰符,可能是有意义的。这与kennytm使用全局变量的答案没有本质区别,但是我的版本将全局状态隐藏在类变量中,而不是常规的全局变量中。你知道吗这种方法不是线程安全的,尽管您可以通过添加一个锁来实现,该锁是围绕
self.depth
的更改和检查而设置的。昂贵的计算只针对对上下文管理器的任何嵌套调用数的最外层运行。你知道吗相关问题 更多 >
编程相关推荐