diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-04-11 19:45:59 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-11 19:45:59 (GMT) |
commit | f50354adaaafebe95ad09d09b825804a686ea843 (patch) | |
tree | 0dc403f1d0b0557927df7857c4c666235c4a3321 /Lib | |
parent | e8a6bb4f3936123f3eca0b6cea05e2875a2722bc (diff) | |
download | cpython-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.py | 35 | ||||
-rw-r--r-- | Lib/test/test_tempfile.py | 5 |
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 |