]> granicus.if.org Git - python/commitdiff
Reimplement tempfile._RandomNameSequence using a generator function. (#1075)
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 11 Apr 2017 19:45:59 +0000 (22:45 +0300)
committerGitHub <noreply@github.com>
Tue, 11 Apr 2017 19:45:59 +0000 (22:45 +0300)
Lib/tempfile.py
Lib/test/test_tempfile.py

index 61462357c7283e13716b6a3fe431b7ca64b11a3d..6112208382871a42c64b6393d6e9f2ccc3d238fb 100644 (file)
@@ -133,32 +133,21 @@ def _sanitize_params(prefix, suffix, dir):
     return prefix, suffix, dir, output_type
 
 
-class _RandomNameSequence:
-    """An instance of _RandomNameSequence generates an endless
-    sequence of unpredictable strings which can safely be incorporated
-    into file names.  Each string is six characters long.  Multiple
-    threads can safely use the same instance at the same time.
-
-    _RandomNameSequence is an iterator."""
+def _RandomNameSequence():
+    """Generate an endless sequence of unpredictable strings which
+    can safely be incorporated into file names.  Each string is 8
+    characters long.  Multiple threads and forked processes can
+    safely use the same instance at the same time."""
 
     characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
-
-    @property
-    def rng(self):
+    rng_pid = None
+    while True:
         cur_pid = _os.getpid()
-        if cur_pid != getattr(self, '_rng_pid', None):
-            self._rng = _Random()
-            self._rng_pid = cur_pid
-        return self._rng
-
-    def __iter__(self):
-        return self
-
-    def __next__(self):
-        c = self.characters
-        choose = self.rng.choice
-        letters = [choose(c) for dummy in range(8)]
-        return ''.join(letters)
+        if cur_pid != rng_pid:
+            choose = _Random().choice
+            rng_pid = cur_pid
+        letters = [choose(characters) for dummy in range(8)]
+        yield ''.join(letters)
 
 def _candidate_tempdir_list():
     """Generate a list of candidate temporary directories which
index 51df1ecd7d18e63e0f927cde322087f007d3eee5..367e48dbe93d26ef529e2c6b79b469c1147f7f2a 100644 (file)
@@ -1,4 +1,5 @@
 # tempfile.py unit tests.
+import collections.abc
 import tempfile
 import errno
 import io
@@ -290,9 +291,9 @@ class TestGetCandidateNames(BaseTestCase):
     """Test the internal function _get_candidate_names."""
 
     def test_retval(self):
-        # _get_candidate_names returns a _RandomNameSequence object
+        # _get_candidate_names returns an iterator
         obj = tempfile._get_candidate_names()
-        self.assertIsInstance(obj, tempfile._RandomNameSequence)
+        self.assertIsInstance(obj, collections.abc.Iterator)
 
     def test_same_thing(self):
         # _get_candidate_names always returns the same object