Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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[bytes]`` protocol.

Patch by Kyungmin Lee.