-1

Сегодня, играя с замками, я заметил следующую ситуацию. Предположим, что у меня есть следующий код, который необходимо заблокировать. Используя старый способ с приобретать и освободить:Python-грамматика с конструкцией недостаточно гибкая

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

Нет '' '' '' с 'операцией'; присвойте свой 'else' тому же отступу, что и ваш оператор' if'. – Evert

+0

Да, но это заставит меня удерживать замок на большее время, чем то, что я на самом деле хочу удержать. Если я использую первый способ, я могу его освободить, когда захочу. –

+0

Ваш первый пример, если он испорчен: если 'condition' является' False', вы никогда не освобождаете блокировку. – Evert

ответ

2

Это не то, что «есть» для. Он существует, чтобы гарантировать, что функция release будет вызвана независимо от того, что.

Если вы хотите условно назвать release, тогда не используйте with. Вероятно, есть лучшая альтернатива вашему коду, используя with, но это невозможно узнать, не видя полного контекста.

О вашем новом коде, ИМО лучшей альтернативой будет:

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 или еще несколько вызовов функций, не будет путаницы в том, удерживается ли замок или нет.

+0

Я немного изменил ситуацию. Мне показалось справедливым, чтобы вы знали. –

+0

@JadieldeArmas: Спасибо за подсказку. Я соответствующим образом обновил ответ. – rodrigo

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

Я немного изменил ситуацию. Мне показалось справедливым, чтобы вы знали. –

 Смежные вопросы

  • Нет связанных вопросов^_^