Reimplement tempfile._RandomNameSequence using a generator function. (#1075)
This commit is contained in:
parent
e8a6bb4f39
commit
f50354adaa
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue