用上下文安全变量和服务替换全局变量
Contextual的Python项目详细描述
可更换单体
下面是用peak.context实现的一个简单的"全局"计数器服务 看起来像:
>>> from peak import context >>> class Counter(context.Service): ... value = 0 ... ... def inc(self): ... self.value += 1 ... >>> Counter.value 0 >>> Counter.inc() >>> Counter.value 1
希望使用此全局计数器的代码只调用 counter.inc() 或 访问计数器.value,它将自动使用右边的计数器 当前线程或任务的实例。想用新的柜台 考试?只要这样做:
with Counter.new(): # code that uses the standard count.* API
在 with 块中,任何引用 count 的代码都将使用 新的计数器实例。如果需要支持Python2.4,则 上下文库还包括一个decorator,它用 模拟a 声明:
>>> Counter.value # before using a different counter 1 >>> @context.call_with(Counter.new()) ... def do_it(c): ... print Counter.value 0 >>> Counter.value # The original counter is now in use again 1
带有装饰符的call_比带有政治家的call_要丑一点但 它也起作用了。你也可以用老式的try finally block, 或其他一些前后机制,如 setup() 和 teardown() 替换和还原活动实例的测试方法。