From 4774946c3b7564b4a1c93da4ba4dba443a36a708 Mon Sep 17 00:00:00 2001 From: Hynek Schlawack Date: Sun, 15 Jul 2012 16:21:30 +0200 Subject: [PATCH] #15180: Clarify posixpath.join() error message when mixing str & bytes --- Lib/posixpath.py | 19 +++++++++++++------ Lib/test/test_posixpath.py | 11 +++++++++-- Misc/NEWS | 2 ++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Lib/posixpath.py b/Lib/posixpath.py index 9570a364a00..84bcc1355f9 100644 --- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -74,13 +74,20 @@ def join(a, *p): will be discarded.""" sep = _get_sep(a) path = a - for b in p: - if b.startswith(sep): - path = b - elif not path or path.endswith(sep): - path += b + try: + for b in p: + if b.startswith(sep): + path = b + elif not path or path.endswith(sep): + path += b + else: + path += sep + b + except TypeError: + strs = [isinstance(s, str) for s in (a, ) + p] + if any(strs) and not all(strs): + raise TypeError("Can't mix strings and bytes in path components.") else: - path += sep + b + raise return path diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py index a7a3e4aa12d..54de0cf5163 100644 --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -56,8 +56,15 @@ class PosixPathTest(unittest.TestCase): self.assertEqual(posixpath.join(b"/foo/", b"bar/", b"baz/"), b"/foo/bar/baz/") - self.assertRaises(TypeError, posixpath.join, b"bytes", "str") - self.assertRaises(TypeError, posixpath.join, "str", b"bytes") + with self.assertRaises(TypeError) as e: + posixpath.join(b'bytes', 'str') + self.assertIn("Can't mix strings and bytes", e.args[0]) + with self.assertRaises(TypeError) as e: + posixpath.join('str', b'bytes') + self.assertIn("Can't mix strings and bytes", e.args[0]) + with self.assertRaises(TypeError) as e: + posixpath.join('str', bytearray(b'bytes')) + self.assertIn("Can't mix strings and bytes", e.args[0]) def test_split(self): self.assertEqual(posixpath.split("/foo/bar"), ("/foo", "bar")) diff --git a/Misc/NEWS b/Misc/NEWS index 81665e39da0..74e40387a2f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -87,6 +87,8 @@ Core and Builtins Library ------- +- Issue #15180: Clarify posixpath.join() error message when mixing str & bytes + - Issue #15230: runpy.run_path now correctly sets __package__ as described in the documentation