2016-05-26 21 views
5

Korzystanie Python 2.6.6Jak odblokować Python Lock jest nabywany za pomocą instrukcji "with"?

Tak właśnie dowiedział się, że następujące:

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

można zastąpić:

with myLock: 
    doStuff() 

My quandry jest to, że z dawnego kodeksu że mogłem unittest zamek był używany do ochrony rzeczy, kpiąc z zamka. Ale z tą ostatnią moja unittest teraz (prawdopodobnie) się nie powiedzie, ponieważ acqu() i release() nie są wywoływane. Więc w tym drugim przypadku, w jaki sposób mogę sprawdzić, czy blokada jest używana do ochrony rzeczy-rzeczy?

Wolę drugą metodę, ponieważ jest nie tylko bardziej zwięzłe, ale nie ma szans, że będę pisać kod, który zapomina, aby odblokować zasób. (Nie, że nigdy wcześniej tego nie robiłem ...)

Odpowiedz

6

Instrukcja wewnętrzna wywołuje metody magiczne na początku i na końcu (odpowiednio). Możesz wyłudzić te metody, używając MagicMock lub jawnie ustawiając mock.__enter__ = Mock();mock.__exit__ = Mock().

Ustawienie magicznych metod w ten sposób działa tylko w przypadku makiet; aby nadpisać magiczną metodę na obiekcie niemuzycznym, musisz ustawić go na typ.