本质上,我想在堆栈上放置一个变量,该变量可通过堆栈下面的所有调用访问,直到块退出。在Java中,我会使用支持方法的本地静态线程解决此问题,然后可以从方法访问。如何将变量放在Python中的堆栈/上下文中
典型示例:获取请求并打开数据库连接。在请求完成之前,您希望所有代码都使用此数据库连接。完成并关闭请求后,关闭数据库连接。
我需要的是一个报告生成器。每个报告由多个部分组成,每个部分可以依赖于不同的计算,有时不同的部分部分依赖于相同的计算。由于我不想重复繁重的计算,我需要缓存它们。我的想法是用缓存修饰器来装饰方法。缓存根据方法名称和模块创建一个id,它是参数,查看它是否已经在堆栈变量中计算了这个值,如果没有,则执行该方法。
我会试着通过显示我当前的实施来清除。我想要做的是简化那些实现计算的代码。
首先,我有中央高速缓存访问对象,我称之为的MathContext:
class MathContext(object):
def __init__(self, fn):
self.fn = fn
self.cache = dict()
def get(self, calc_config):
id = create_id(calc_config)
if id not in self.cache:
self.cache[id] = calc_config.exec(self)
return self.cache[id]
使用fn参数是上下文有关创建的,文件名从那里可以读取的数据来计算的。
然后我们计算类:
class CalcBase(object):
def exec(self, math_context):
raise NotImplementedError
这里是一个愚蠢的斐波那契数的例子。方法非实际上是递归的,他们在大集,而不是数据的工作,但它的作品来证明你将如何依赖于其他计算:
class Fibonacci(CalcBase):
def __init__(self, n): self.n = n
def exec(self, math_context):
if self.n < 2: return 1
a = math_context.get(Fibonacci(self.n-1))
b = math_context.get(Fibonacci(self.n-2))
return a+b
我想斐波那契数是不是,只是一种装饰方法:
@cache
def fib(n):
if n<2: return 1
return fib(n-1)+fib(n-2)
通过math_context示例,当math_context超出作用域时,所有缓存值也是如此。我想为装饰者做同样的事情。 IE浏览器。在X点,@cache缓存的所有内容都被取消为gced。
这个设计有什么问题?看上去不错。看起来它满足你的需求。也许你应该更新你的问题,以显示你想要改变这个代码的位置或方式。或者这个代码做得不好。 – 2009-06-16 15:43:09
最后一点是我想要的,但不知道如何实现。目前的设计是好的,但我觉得这是要输出详细。我宁愿使用装饰方法,因此使用和书写变得更简单。 IE浏览器。它正在清理当前的设计。 – Staale 2009-06-16 16:13:29