summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-04-11 19:45:59 (GMT)
committerGitHub <noreply@github.com>2017-04-11 19:45:59 (GMT)
commitf50354adaaafebe95ad09d09b825804a686ea843 (patch)
tree0dc403f1d0b0557927df7857c4c666235c4a3321 /Lib
parente8a6bb4f3936123f3eca0b6cea05e2875a2722bc (diff)
downloadcpython-f50354adaaafebe95ad09d09b825804a686ea843.zip
cpython-f50354adaaafebe95ad09d09b825804a686ea843.tar.gz
cpython-f50354adaaafebe95ad09d09b825804a686ea843.tar.bz2
Reimplement tempfile._RandomNameSequence using a generator function. (#1075)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/tempfile.py35
-rw-r--r--Lib/test/test_tempfile.py5
2 files changed, 15 insertions, 25 deletions
diff --git a/Lib/tempfile.py b/Lib/tempfile.py
index 6146235..6112208 100644
--- a/Lib/tempfile.py
+++ b/Lib/tempfile.py
@@ -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
diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py
index 51df1ec..367e48d 100644
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -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