bpo-45192: Fix a bug that infers the type of an os.PathLike[bytes] object as str (GH-28323)

An object implementing the os.PathLike protocol can represent a file
system path as a str or bytes object.
Therefore, _infer_return_type function should infer os.PathLike[str]
object as str type and os.PathLike[bytes] object as bytes type.
This commit is contained in:
Kyungmin Lee 2021-10-21 04:54:41 +09:00 committed by GitHub
parent bc85eb7a4f
commit 6270d3eeaf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 0 deletions

View File

@ -88,6 +88,10 @@ def _infer_return_type(*args):
for arg in args:
if arg is None:
continue
if isinstance(arg, _os.PathLike):
arg = _os.fspath(arg)
if isinstance(arg, bytes):
if return_type is str:
raise TypeError("Can't mix bytes and non-bytes in "

View File

@ -62,6 +62,25 @@ class TestLowLevelInternals(unittest.TestCase):
def test_infer_return_type_pathlib(self):
self.assertIs(str, tempfile._infer_return_type(pathlib.Path('/')))
def test_infer_return_type_pathlike(self):
class Path:
def __init__(self, path):
self.path = path
def __fspath__(self):
return self.path
self.assertIs(str, tempfile._infer_return_type(Path('/')))
self.assertIs(bytes, tempfile._infer_return_type(Path(b'/')))
self.assertIs(str, tempfile._infer_return_type('', Path('')))
self.assertIs(bytes, tempfile._infer_return_type(b'', Path(b'')))
self.assertIs(bytes, tempfile._infer_return_type(None, Path(b'')))
self.assertIs(str, tempfile._infer_return_type(None, Path('')))
with self.assertRaises(TypeError):
tempfile._infer_return_type('', Path(b''))
with self.assertRaises(TypeError):
tempfile._infer_return_type(b'', Path(''))
# Common functionality.

View File

@ -0,0 +1,5 @@
Fix the ``tempfile._infer_return_type`` function so that the ``dir``
argument of the :mod:`tempfile` functions accepts an object implementing the
``os.PathLike`` protocol.
Patch by Kyungmin Lee.