-1

오늘 자물쇠를 가지고 노는 동안, 나는 다음 상황을 알았다. 잠글 필요가있는 다음 코드가 있다고 가정하십시오. 획득과 이전 방법을 사용하고 방출 :구조가있는 파이썬 문법이 충분히 융통성이 없음

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() 

아니면 할 수 있습니까? 제가 틀렸다면 제발 정정 해주세요.

+0

'with' 문과 함께 'else'가 없습니다. 'else'를'if' 문과 같은 들여 쓰기로 들여 쓰기하십시오. – Evert

+0

네,하지만 그건 사실 내가 갖고있는 것보다 더 오랜 시간 동안 자물쇠를 잡아야합니다. 첫 번째 방법을 사용하면 원하는대로 풀어 낼 수 있습니다. –

+0

첫 번째 예 : 결함이있는 경우 : '조건'이 '거짓'인 경우 절대로 잠금을 해제하지 마십시오. – Evert

답변

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 또는 몇 가지 다른 함수 호출을 추가하려는 경우 잠금이 유지되는지 여부에 대해 혼동이 없어야합니다. 다음과 같이 Lock 클래스가 제대로 __enter____exit__ 방법을 구현하는 제공

+0

나는 상황을 약간 바꿨다. 그것은 당신에게 알려주는 것이 공정한 것처럼 보였습니다. –

+0

@JadieldeArmas : 팁 주셔서 감사. 그에 따라 답변을 업데이트했습니다. – rodrigo

0

, 당신이 그것을 사용할 수 있습니다

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

만약 대신, 더 잠금 장치가없는 경우 dosomethingElse()하려는,이 코드는 다음과 같습니다

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

나는 상황을 약간 바꿨다. 그것은 당신에게 알려주는 것이 공정한 것처럼 보였습니다. –