diff options
| -rw-r--r-- | Lib/tempfile.py | 35 | ||||
| -rw-r--r-- | Lib/test/test_tempfile.py | 5 | 
2 files changed, 25 insertions, 15 deletions
| diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 6112208..6146235 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -133,21 +133,32 @@ def _sanitize_params(prefix, suffix, dir):      return prefix, suffix, dir, output_type -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.""" +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."""      characters = "abcdefghijklmnopqrstuvwxyz0123456789_" -    rng_pid = None -    while True: + +    @property +    def rng(self):          cur_pid = _os.getpid() -        if cur_pid != rng_pid: -            choose = _Random().choice -            rng_pid = cur_pid -        letters = [choose(characters) for dummy in range(8)] -        yield ''.join(letters) +        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)  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 367e48d..51df1ec 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -1,5 +1,4 @@  # tempfile.py unit tests. -import collections.abc  import tempfile  import errno  import io @@ -291,9 +290,9 @@ class TestGetCandidateNames(BaseTestCase):      """Test the internal function _get_candidate_names."""      def test_retval(self): -        # _get_candidate_names returns an iterator +        # _get_candidate_names returns a _RandomNameSequence object          obj = tempfile._get_candidate_names() -        self.assertIsInstance(obj, collections.abc.Iterator) +        self.assertIsInstance(obj, tempfile._RandomNameSequence)      def test_same_thing(self):          # _get_candidate_names always returns the same object | 
