2012-06-15 31 views
2

我有一个在模块级别称为fsdata字典(像一个全局变量)。延迟加载字典

内容从文件系统读取。它应该在首次访问时加载一次数据。到目前为止,它在导入模块期间加载数据。这应该被优化。

如果没有代码访问fsdata,内容不应该被从文件系统(节省CPU/IO)读取。

加载应该发生,如果你检查布尔值,太:

if mymodule.fsdata: 
    ... do_something() 

更新:有些代码已经使用mymodule.fsdata。我不想改变其他地方。它应该是可变的,而不是一个函数。而且“mymodule”需要成为一个模块,因为它已经用于很多代码中。

+1

问题是什么? –

+0

我从'dict'派生出来,在新类中进行延迟加载并重写'_bool __()'方法,这样如果在if中使用它,它也会被加载。 – phg

+0

它是否具有变量/属性(而不是函数)? – georg

回答

1

你可以只创建一个简单的函数,memoizes数据:

fsdata = [] 

def get_fsdata: 
    if not fsdata: 
     fsdata.append(load_fsdata_from_file()) 
    return fsdata[0] 

(我用一个列表,这是一个简单的方法来使一个可变全球,而不与全球各地的关键字碴)。

现在,而不是指module.fsdata,你可以叫module.get_fsdata()

+0

谢谢,但'module.fsdata'已在其他地方使用。我更新了答案。 – guettli

2

您可以用object有描述语义更换你的模块:

class FooModule(object): 
    @property 
    def bar(self): 
     print "get" 
import sys 
sys.modules[__name__] = FooModule() 

看看http://pypi.python.org/pypi/apipkg的包装方法。

+0

是的,这是链接线程中建议的内容。 – georg