Pythonic关闭/终止对象的方式

时间:2011-08-02 05:39:45

标签: multithreading python

我有一个Whoosh(文件索引器)编写器对象

>>> a
<whoosh.filedb.filewriting.SegmentWriter object at 0x013DFE10>

由于whoosh不允许多个编写者并实现线程安全(AFAIK !!),我希望关闭该对象在使用时。

>>> a.is_closed
False

但它没有密切的方法。我确信所有成熟的python库对象都有内部函数,例如__ exit__,它们允许所有基本功能。关闭Python对象的正确方法是什么?或者它取决于图书馆本身?我采用“单一但显而易见的方法来做正确的”Python的文字形式

这是dir(a)的粘贴:http://pastebin.com/Q5hceTr8


后记

我刚刚在Confused about Python's with statement询问前一天刚刚了解了with声明。这个问题很明显,因为我需要一种处理全局对象的方法;这样我可以在多次添加或删除后进行提交。好像whoosh有一个searcher.close()而不是一个indexer.close(),似乎不一致

2 个答案:

答案 0 :(得分:7)

如果它有__enter____exit__方法,则表示它实现了context manager protocol,您应该像这样使用它:

with constructor(args) as a:
    # do stuff with a
    pass
# here a is closed even if you had an error above

其中constructor是类本身或您用来创建它的任何工厂函数。在Python 2.5中,您需要from __future__ import with_statement

答案 1 :(得分:5)

  

我确信所有成熟的python库对象都有内部函数,例如__ exit__,它们允许所有基本功能。

他们这样做,而你的pastebin就是这样 - 请参阅顶部的__exit__

这是一种用于实现以下内容的特殊方法......

  

关闭Python对象的正确方法是什么?

自动使用with-block:

with some_api_call() as awesome_thing_from_api:
    use(awesome_thing_from_api)