diff -r 0fadf332f0d4 Lib/test/lock_tests.py --- a/Lib/test/lock_tests.py Fri Jun 05 21:03:52 2015 -0500 +++ b/Lib/test/lock_tests.py Sat Jun 06 13:23:20 2015 +0300 @@ -394,6 +394,12 @@ class EventTests(BaseTestCase): b.wait_for_finished() self.assertEqual(results, [True] * N) + def test_repr(self): + evt = self.eventtype() + self.assertRegex(repr(evt), "") + evt.set() + self.assertRegex(repr(evt), "") + class ConditionTests(BaseTestCase): """ @@ -698,6 +704,15 @@ class SemaphoreTests(BaseSemaphoreTests) sem.acquire() sem.release() + def test_repr(self): + sem = self.semtype(3) + self.assertRegex(repr(sem), "") + sem.acquire() + self.assertRegex(repr(sem), "") + sem.release() + sem.release() + self.assertRegex(repr(sem), "") + class BoundedSemaphoreTests(BaseSemaphoreTests): """ @@ -712,6 +727,12 @@ class BoundedSemaphoreTests(BaseSemaphor sem.release() self.assertRaises(ValueError, sem.release) + def test_repr(self): + sem = self.semtype(3) + self.assertRegex(repr(sem), "") + sem.acquire() + self.assertRegex(repr(sem), "") + class BarrierTests(BaseTestCase): """ @@ -904,3 +925,18 @@ class BarrierTests(BaseTestCase): b = self.barriertype(1) b.wait() b.wait() + + def test_repr(self): + b = self.barriertype(3) + self.assertRegex(repr(b), "") + def f(): + b.wait(3) + bunch = Bunch(f, 2) + bunch.wait_for_started() + time.sleep(0.2) + self.assertRegex(repr(b), "") + b.wait(3) + bunch.wait_for_finished() + self.assertRegex(repr(b), "") + b.abort() + self.assertRegex(repr(b), "") diff -r 0fadf332f0d4 Lib/threading.py --- a/Lib/threading.py Fri Jun 05 21:03:52 2015 -0500 +++ b/Lib/threading.py Sat Jun 06 13:23:20 2015 +0300 @@ -382,6 +382,10 @@ class Semaphore: self._cond = Condition(Lock()) self._value = value + def __repr__(self): + return "<%s: %r at %#x>" % (self.__class__.__name__, + self._value, id(self)) + def acquire(self, blocking=True, timeout=None): """Acquire a semaphore, decrementing the internal counter by one. @@ -465,6 +469,11 @@ class BoundedSemaphore(Semaphore): Semaphore.__init__(self, value) self._initial_value = value + def __repr__(self): + return "<%s: %r/%r at %#x>" % (self.__class__.__name__, + self._value, self._initial_value, + id(self)) + def release(self): """Release a semaphore, incrementing the internal counter by one. @@ -497,6 +506,11 @@ class Event: self._cond = Condition(Lock()) self._flag = False + def __repr__(self): + return '<%s %s at %#x>' % ('set' if self._flag else 'unset', + self.__class__.__name__, + id(self)) + def _reset_internal_locks(self): # private! called by Thread._reset_internal_locks by _after_fork() self._cond.__init__() @@ -595,6 +609,12 @@ class Barrier: self._state = 0 #0 filling, 1, draining, -1 resetting, -2 broken self._count = 0 + def __repr__(self): + return '<%s%s: %r/%r at %#x>' % ('broken ' if self.broken else '', + self.__class__.__name__, + self._count, self._parties, + id(self)) + def wait(self, timeout=None): """Wait for the barrier.