我正在开发一本开源的中级Python书籍并经历了许多PEP。在PEP310中,有一条旧的“with”语句提案。该提案最终被拒绝,但以下声明让我感到震惊:“另一个常见错误是在try块中编码”acquire“调用,如果获取失败,则会错误地释放锁定。”
有人可以详细说明如何将获取置于尝试中改变事物吗?根据我的理解,在Python中获取调用只返回一个布尔值,指示是否成功获取了锁,那么如何将它放入try块中会改变一些东西?
答案 0 :(得分:6)
我相信这就是它所指的:
try:
lock.acquire()
finally:
lock.release()
如果acquire()
引发异常,即使release()
未成功,也会调用acquire()
。在当前未锁定的锁上调用release()
可能会引发另一个异常,即仅与问题根源间接相关的异常。
编写块的正确方法是使用with
或:
lock.acquire()
try:
...
finally:
lock.release()
您应该始终编写代码以满足异常,无论文档是否表明呼叫引发了异常。没有什么可以阻止将来改变行为。