2

我有一个fsdata在模块级别调用的字典(如全局变量)。

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

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

如果您也检查布尔值,则应该进行加载:

if mymodule.fsdata:
    ... do_something()

更新:一些代码已经使用了 mymodule.fsdata。我不想改变其他地方。它应该是变量,而不是函数。并且“mymodule”必须是一个模块,因为它已经在很多代码中使用。

4

3 回答 3

3

我认为您应该像这样使用 Future/Promise https://gist.github.com/2935416

要点 - 你创建的不是一个对象,而是一个关于对象的“承诺”,它的行为就像一个对象。

于 2012-06-15T08:34:53.470 回答
2

您可以将模块替换为object具有描述符语义的模块:

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

查看http://pypi.python.org/pypi/apipkg以了解打包方法。

于 2012-06-15T08:44:15.827 回答
1

您可以创建一个简单的函数来记忆数据:

fsdata = []

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

(我正在使用列表,因为这是一种使变量成为全局变量而无需使用 global 关键字的简单方法)。

现在,module.fsdata您可以直接调用module.get_fsdata().

于 2012-06-15T08:35:26.897 回答