Pylons:免费的模块级变量?

时间:2010-01-24 22:29:46

标签: python object scope singleton pylons

此处不确定模块级别是否正确,但是......

我有一个Pylons项目,在模型组件中,我在__init__.py中有一个全局变量doc,我想从不同的Query对象中使用它。 (doc是我用作假数据库的XML文件的Document句柄。)我的问题是,__init__.py的范围何时结束?目前我没有使用doc.unlink()释放文档,我不知道该把它放在哪里。

我正在考虑的替代设计使得使用对象(Query)具有该doc的类级变量(即使其成为单例)。但似乎我的Query对象的生命周期总是会重新分配一个新的Document句柄。

class Query(object):
    doc = None 

    def __init__(self, content=None):
        self.content = content
        if self.doc == None:                        
            self.doc = parse(os.path.join(config['app_conf']['xmldb'], "sample_search_result.xml"))

我可以说,因为文档中元素的地址不断变化。

有人想帮助noobie吗?

2 个答案:

答案 0 :(得分:0)

对象仅在1)不存在对它们的引用或2)解释器结束时停止存在。模块/包保持对其私有字典中所有模块级名称的引用;删除所有其他模块以及sys.modules,中对模块的所有引用,对其中任何对象的所有引用都将释放该模块。

答案 1 :(得分:0)

您是否考虑过将 doc 对象放入globals?由于它是一个不可变的对象,它应该是存储它的最佳位置。您可以从任何控制器引用globals并将其传递给Query对象(在__init__期间或在对象上调用方法时显式传递)

您还可以尝试将 doc 对象存储在控制器的session中(如果每个会话需要读取)