Skip to content

Commit

Permalink
bpo-45192: Fix a bug that infers the type of an os.PathLike[bytes] ob…
Browse files Browse the repository at this point in the history
…ject 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.
  • Loading branch information
rekyungmin authored Oct 20, 2021
1 parent bc85eb7 commit 6270d3e
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Lib/tempfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 "
Expand Down
19 changes: 19 additions & 0 deletions Lib/test/test_tempfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,25 @@ def test_infer_return_type_multiples_and_none(self):
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.

Expand Down
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit 6270d3e

Please sign in to comment.