有没有使用Python的标准方法Queue
in a with
陈述?这就是我希望能够使用它的方式:
import Queue
myqueue = Queue.Queue()
...
...
...
with myqueue as nextItem:
doStuff(nextItem)
没有__enter__
or __exit__
方法用于Queue
对象,所以这不起作用。有没有任何语法糖可以让它看起来比这更好?
import Queue
myqueue = Queue.Queue()
...
...
...
try:
nextItem = myqueue.get()
doStuff(nextItem)
finally:
myqueue.task_done()
Edit:我有两个原因想要使用with
在这种情况下的声明。首先,我认为一个with
声明将帮助我的代码更干净一点,特别是当不仅仅是单个调用时doStuff
。其次,最好有一些简单的东西,我可以养成每次使用的习惯,以确保我永远不会忘记打电话task_done
或者存在错误可能导致调用被跳过的情况。
有几个简单的选项可以确保无论如何都会在队列上调用 task_done() 。如果您需要对队列中的某个项目执行的工作很复杂,或者需要对每个项目执行多个代码路径,则这些功能特别有用。
第一个选项特定于队列。它与 Rob 的建议类似,但不需要创建 Queue 的子类。
@contextlib.contextmanager
def mark_done(queue):
try:
yield queue.get()
finally:
queue.task_done()
queue = Queue()
# assume you put stuff in the queue
with mark_done(queue) as item:
item.do_stuff()
我喜欢一种更通用的形式,无论何时您想在代码块末尾调用函数,该形式都很有用,并且该函数与块顶部的对象相关:
@contextlib.contextmanager
def defer(func):
try:
yield
finally:
func()
queue = Queue()
# assume you put stuff in the queue
item = queue.get()
with defer(queue.task_done):
item.do_stuff()
使用第二种形式需要额外的一行代码,但考虑到可读性,它使上下文管理器将要做什么变得非常清楚。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)