mirror of
https://github.com/python/cpython.git
synced 2025-07-23 11:15:24 +00:00
bpo-45192: Fix a bug that infers the type of an os.PathLike[bytes] object as str (GH-28323) (GH-29111)
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.
(cherry picked from commit 6270d3eeaf
)
Co-authored-by: Kyungmin Lee <rekyungmin@gmail.com>
This commit is contained in:
parent
b2a989995e
commit
64e83c711e
3 changed files with 28 additions and 0 deletions
|
@ -88,6 +88,10 @@ def _infer_return_type(*args):
|
||||||
for arg in args:
|
for arg in args:
|
||||||
if arg is None:
|
if arg is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if isinstance(arg, _os.PathLike):
|
||||||
|
arg = _os.fspath(arg)
|
||||||
|
|
||||||
if isinstance(arg, bytes):
|
if isinstance(arg, bytes):
|
||||||
if return_type is str:
|
if return_type is str:
|
||||||
raise TypeError("Can't mix bytes and non-bytes in "
|
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):
|
def test_infer_return_type_pathlib(self):
|
||||||
self.assertIs(str, tempfile._infer_return_type(pathlib.Path('/')))
|
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.
|
# 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…
Add table
Add a link
Reference in a new issue