mirror of https://github.com/python/cpython
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:
parent
bc85eb7a4f
commit
6270d3eeaf
|
@ -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 "
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue