构造的Python语法不够灵活

时间:2014-10-09 06:21:11

标签: python python-2.7 multiprocessing python-multiprocessing

今天,玩锁,我注意到以下情况。假设我有以下需要锁定的代码。使用旧方式获取和释放:

lock=Lock()
lock.acquire()
a=foo()
if condition:
    doSomething()
    lock.release()
else:
    lock.release()
    doSomethingElse()

这段代码无法使用with构造实现:

lock=Lock()
with lock:
    a=foo()
    if condition:
        doSomething()
else:    #This is wrong grammar here.
    doSomethingElse()   

或者可以吗?如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:2)

那不是'用'是为了。它的存在是为了保证无论如何都会调用release函数。

如果您想有条件地拨打release,请不要使用with。使用with可能有更好的替代代码,但如果没有看到完整的上下文,就无法知道。

关于您的新代码,IMO最好的选择是:

with Lock(): # no need for the lock name
    a=foo()
    # c is used just in case your condition is a complex expression with side effects
    c = condition
    if c:
        doSomething()

if not c:
    doSomethingElse()  

现在锁的范围很明显。如果您想添加try/catch或其他几个函数调用,则不会混淆是否保持锁定。

答案 1 :(得分:0)

如果Lock类正确实现了__enter____exit__方法,您可以按如下方式使用它:

with Lock() as lock:
    a=foo()
    if condition:
        doSomething()
    else:
        doSomethingElse()   

如果您想要dosomethingElse(),如果没有锁定,那么这就是代码:

if condition:
    with Lock() as lock:
        a = foo()
        doSomething()
else:
    doSomethingElse()