2016-05-26 2 views
5

Использование Python 2.6.6Как отключить блокировку Python с помощью инструкции 'with'?

Так что я только что узнал, что следующее:

myLock.acquire() 
doStuff() 
myLock.release() 

можно заменить:

with myLock: 
    doStuff() 

Мой quandry что с прежним кодом я мог UnitTest что блокировка использовалась для защиты работы, издеваясь над Lock. Но с последним мой unittest теперь (предположительно) терпит неудачу, потому что gets() и release() не вызываются. Итак, для последнего случая, как я могу проверить, что блокировка используется для защиты дела?

Я предпочитаю второй метод, потому что он не только более краткий, но нет никаких шансов, что я напишу код, который забывает разблокировать ресурс. (Не то, чтобы я когда-либо делал это раньше ...)

ответ

6

Оператор with внутренне вызывает методы магии в начале и конце (соответственно) __enter__ и __exit__. Вы можете высмеять эти методы либо с помощью MagicMock, либо путем явной установки mock.__enter__ = Mock();mock.__exit__ = Mock().

Установка магических методов таким образом работает только для насмешек; чтобы переопределить магический метод на немоктивном объекте, вы должны установить его для типа.