From 07c6e7168919c275e47fa35c741413270d3d80fd Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 24 Aug 2012 13:05:09 -0400 Subject: [PATCH] Issue #15778: Coerce ImportError.args to a string when it isn't already one. Patch by Dave Malcolm. --- Lib/test/test_exceptions.py | 5 +++++ Misc/NEWS | 3 +++ Objects/exceptions.c | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 0b1fd1b8b9b..55e9db37803 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -937,6 +937,11 @@ class ImportErrorTests(unittest.TestCase): self.assertEqual(exc.name, 'somename') self.assertEqual(exc.path, 'somepath') + def test_non_str_argument(self): + # Issue #15778 + arg = b'abc' + exc = ImportError(arg) + self.assertEqual(str(arg), str(exc)) def test_main(): diff --git a/Misc/NEWS b/Misc/NEWS index 57f022c048f..e772a703935 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.3.0 Release Candidate 1? Core and Builtins ----------------- +- Issue #15778: ensure that str(ImportError(msg)) returns a str + even when msg isn't a str. + - Issue #2051: Source file permission bits are once again correctly copied to the cached bytecode file. (The migration to importlib reintroduced this problem because these was no regression test. A test diff --git a/Objects/exceptions.c b/Objects/exceptions.c index b7e11f85bfe..74bb26285ef 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -679,7 +679,7 @@ ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg) static PyObject * ImportError_str(PyImportErrorObject *self) { - if (self->msg) { + if (self->msg && PyUnicode_CheckExact(self->msg)) { Py_INCREF(self->msg); return self->msg; }