From 80a1bf4b5db4880f01d30b89ab5f6c436d50c8e6 Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Tue, 12 Nov 2002 23:01:12 +0000 Subject: Fix SF # 635969, No error "not all arguments converted" When mwh added extended slicing, strings and unicode became mappings. Thus, dict was set which prevented an error when doing: newstr = 'format without a percent' % string_value This fix raises an exception again when there are no formats and % with a string value. --- Lib/test/test_format.py | 8 ++++++++ Objects/stringobject.c | 3 ++- Objects/unicodeobject.c | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py index b40e820..da4d85a 100644 --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -221,6 +221,14 @@ if have_unicode: test_exc('%d', '1', TypeError, "int argument required") test_exc('%g', '1', TypeError, "float argument required") +test_exc('no format', '1', TypeError, + "not all arguments converted during string formatting") +test_exc('no format', u'1', TypeError, + "not all arguments converted during string formatting") +test_exc(u'no format', '1', TypeError, + "not all arguments converted during string formatting") +test_exc(u'no format', u'1', TypeError, + "not all arguments converted during string formatting") if sys.maxint == 2**32-1: # crashes 2.2.1 and earlier: diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 35b4b47..bf8bad5 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -3622,7 +3622,8 @@ PyString_Format(PyObject *format, PyObject *args) arglen = -1; argidx = -2; } - if (args->ob_type->tp_as_mapping && !PyTuple_Check(args)) + if (args->ob_type->tp_as_mapping && !PyTuple_Check(args) && + !PyObject_TypeCheck(args, &PyBaseString_Type)) dict = args; while (--fmtcnt >= 0) { if (*fmt != '%') { diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index c1cdebc..12846bf 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6181,7 +6181,8 @@ PyObject *PyUnicode_Format(PyObject *format, arglen = -1; argidx = -2; } - if (args->ob_type->tp_as_mapping && !PyTuple_Check(args)) + if (args->ob_type->tp_as_mapping && !PyTuple_Check(args) && + !PyObject_TypeCheck(args, &PyBaseString_Type)) dict = args; while (--fmtcnt >= 0) { -- cgit v0.12