From cbda8fc5d76b10bcbb92d927537576c229143836 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Mon, 1 Oct 2018 21:54:39 -0700 Subject: [PATCH] closes bpo-34868: Improve error message with '_' is combined with an invalid type specifier. (GH-9666) --- Lib/test/test_long.py | 3 +++ Python/formatter_unicode.c | 17 +++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index 7c883baebb..5b860dd36b 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -700,6 +700,9 @@ class LongTest(unittest.TestCase): self.assertRaisesRegex(ValueError, 'Cannot specify both', format, 3, '_,d') self.assertRaisesRegex(ValueError, 'Cannot specify both', format, 3, ',_d') + self.assertRaisesRegex(ValueError, "Cannot specify ',' with 's'", format, 3, ',s') + self.assertRaisesRegex(ValueError, "Cannot specify '_' with 's'", format, 3, '_s') + # ensure that only int and float type specifiers work for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] + [chr(x) for x in range(ord('A'), ord('Z')+1)]): diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c index 71e673d9f8..ba09cc67be 100644 --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -28,16 +28,17 @@ unknown_presentation_type(Py_UCS4 presentation_type, } static void -invalid_comma_type(Py_UCS4 presentation_type) +invalid_thousands_separator_type(char specifier, Py_UCS4 presentation_type) { + assert(specifier == ',' || specifier == '_'); if (presentation_type > 32 && presentation_type < 128) PyErr_Format(PyExc_ValueError, - "Cannot specify ',' with '%c'.", - (char)presentation_type); + "Cannot specify '%c' with '%c'.", + specifier, (char)presentation_type); else PyErr_Format(PyExc_ValueError, - "Cannot specify ',' with '\\x%x'.", - (unsigned int)presentation_type); + "Cannot specify '%c' with '\\x%x'.", + specifier, (unsigned int)presentation_type); } static void @@ -117,8 +118,8 @@ is_sign_element(Py_UCS4 c) /* Locale type codes. LT_NO_LOCALE must be zero. */ enum LocaleType { LT_NO_LOCALE = 0, - LT_DEFAULT_LOCALE, - LT_UNDERSCORE_LOCALE, + LT_DEFAULT_LOCALE = ',', + LT_UNDERSCORE_LOCALE = '_', LT_UNDER_FOUR_LOCALE, LT_CURRENT_LOCALE }; @@ -314,7 +315,7 @@ parse_internal_render_format_spec(PyObject *format_spec, } /* fall through */ default: - invalid_comma_type(format->type); + invalid_thousands_separator_type(format->thousands_separators, format->type); return 0; } } -- 2.40.0