我有一个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(),似乎不一致
答案 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)