[Python-checkins] cpython: Issue #20804: The unittest.mock.sentinel attributes now preserve their

serhiy.storchaka python-checkins at python.org
Wed Jan 11 13:13:42 EST 2017


https://hg.python.org/cpython/rev/98f061402fcf
changeset:   106095:98f061402fcf
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Wed Jan 11 20:13:03 2017 +0200
summary:
  Issue #20804: The unittest.mock.sentinel attributes now preserve their
identity when they are copied or pickled.

files:
  Doc/library/unittest.mock.rst              |   4 +++
  Doc/whatsnew/3.7.rst                       |   7 +++++
  Lib/unittest/mock.py                       |   6 ++++
  Lib/unittest/test/testmock/testsentinel.py |  13 ++++++++++
  Misc/NEWS                                  |   3 ++
  5 files changed, 33 insertions(+), 0 deletions(-)


diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst
--- a/Doc/library/unittest.mock.rst
+++ b/Doc/library/unittest.mock.rst
@@ -1831,6 +1831,10 @@
     the same attribute will always return the same object. The objects
     returned have a sensible repr so that test failure messages are readable.
 
+   .. versionchanged:: 3.7
+      The ``sentinel`` attributes now preserve their identity when they are
+      :mod:`copied <copy>` or :mod:`pickled <pickle>`.
+
 Sometimes when testing you need to test that a specific object is passed as an
 argument to another method, or returned. It can be common to create named
 sentinel objects to test this. :data:`sentinel` provides a convenient way of
diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst
--- a/Doc/whatsnew/3.7.rst
+++ b/Doc/whatsnew/3.7.rst
@@ -93,6 +93,13 @@
 Improved Modules
 ================
 
+unittest.mock
+-------------
+
+The :const:`~unittest.mock.sentinel` attributes now preserve their identity
+when they are :mod:`copied <copy>` or :mod:`pickled <pickle>`.
+(Contributed by Serhiy Storchaka in :issue:`20804`.)
+
 
 Optimizations
 =============
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -238,6 +238,9 @@
     def __repr__(self):
         return 'sentinel.%s' % self.name
 
+    def __reduce__(self):
+        return 'sentinel.%s' % self.name
+
 
 class _Sentinel(object):
     """Access attributes to return a named object, usable as a sentinel."""
@@ -250,6 +253,9 @@
             raise AttributeError
         return self._sentinels.setdefault(name, _SentinelObject(name))
 
+    def __reduce__(self):
+        return 'sentinel'
+
 
 sentinel = _Sentinel()
 
diff --git a/Lib/unittest/test/testmock/testsentinel.py b/Lib/unittest/test/testmock/testsentinel.py
--- a/Lib/unittest/test/testmock/testsentinel.py
+++ b/Lib/unittest/test/testmock/testsentinel.py
@@ -1,4 +1,6 @@
 import unittest
+import copy
+import pickle
 from unittest.mock import sentinel, DEFAULT
 
 
@@ -23,6 +25,17 @@
         # If this doesn't raise an AttributeError then help(mock) is broken
         self.assertRaises(AttributeError, lambda: sentinel.__bases__)
 
+    def testPickle(self):
+        for proto in range(pickle.HIGHEST_PROTOCOL+1):
+            with self.subTest(protocol=proto):
+                pickled = pickle.dumps(sentinel.whatever, proto)
+                unpickled = pickle.loads(pickled)
+                self.assertIs(unpickled, sentinel.whatever)
+
+    def testCopy(self):
+        self.assertIs(copy.copy(sentinel.whatever), sentinel.whatever)
+        self.assertIs(copy.deepcopy(sentinel.whatever), sentinel.whatever)
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -212,6 +212,9 @@
 Library
 -------
 
+- Issue #20804: The unittest.mock.sentinel attributes now preserve their
+  identity when they are copied or pickled.
+
 - Issue #29142: In urllib.request, suffixes in no_proxy environment variable with
   leading dots could match related hostnames again (e.g. .b.c matches a.b.c).
   Patch by Milan Oberkirch.

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list