[Python-checkins] bpo-41681: Fix for `f-string/str.format` error description when using 2 `, ` in format specifier (GH-22036)

han-solo webhook-mailer at python.org
Tue Sep 1 10:34:38 EDT 2020


https://github.com/python/cpython/commit/0d6aa7f0ee38eb453bc8f73bf4830e6172be2f35
commit: 0d6aa7f0ee38eb453bc8f73bf4830e6172be2f35
branch: master
author: han-solo <hanish0019 at gmail.com>
committer: GitHub <noreply at github.com>
date: 2020-09-01T10:34:29-04:00
summary:

bpo-41681: Fix for `f-string/str.format` error description when using 2 `,` in format specifier (GH-22036)

* Fixed `f-string/str.format` error description when using two `,` in format specifier.

Co-authored-by: millefalcon <hanish0019 at hmail.com>

files:
A Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst
M Lib/test/test_format.py
M Lib/test/test_fstring.py
M Python/formatter_unicode.c

diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py
index e9e5bb9cf00a6..dff8c69032187 100644
--- a/Lib/test/test_format.py
+++ b/Lib/test/test_format.py
@@ -1,6 +1,7 @@
 from test.support import verbose, TestFailed
 import locale
 import sys
+import re
 import test.support as support
 import unittest
 
@@ -495,6 +496,25 @@ def test_g_format_has_no_trailing_zeros(self):
         self.assertEqual(format(12300050.0, ".6g"), "1.23e+07")
         self.assertEqual(format(12300050.0, "#.6g"), "1.23000e+07")
 
+    def test_with_two_commas_in_format_specifier(self):
+        error_msg = re.escape("Cannot specify ',' with ','.")
+        with self.assertRaisesRegex(ValueError, error_msg):
+            '{:,,}'.format(1)
+
+    def test_with_two_underscore_in_format_specifier(self):
+        error_msg = re.escape("Cannot specify '_' with '_'.")
+        with self.assertRaisesRegex(ValueError, error_msg):
+            '{:__}'.format(1)
+
+    def test_with_a_commas_and_an_underscore_in_format_specifier(self):
+        error_msg = re.escape("Cannot specify both ',' and '_'.")
+        with self.assertRaisesRegex(ValueError, error_msg):
+            '{:,_}'.format(1)
+
+    def test_with_an_underscore_and_a_comma_in_format_specifier(self):
+        error_msg = re.escape("Cannot specify both ',' and '_'.")
+        with self.assertRaisesRegex(ValueError, error_msg):
+            '{:,_}'.format(1)
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py
index 35a62a0632e2e..b9bede0d9b800 100644
--- a/Lib/test/test_fstring.py
+++ b/Lib/test/test_fstring.py
@@ -9,6 +9,7 @@
 
 import ast
 import os
+import re
 import types
 import decimal
 import unittest
@@ -1198,6 +1199,25 @@ def test_invalid_syntax_error_message(self):
         with self.assertRaisesRegex(SyntaxError, "f-string: invalid syntax"):
             compile("f'{a $ b}'", "?", "exec")
 
+    def test_with_two_commas_in_format_specifier(self):
+        error_msg = re.escape("Cannot specify ',' with ','.")
+        with self.assertRaisesRegex(ValueError, error_msg):
+            f'{1:,,}'
+
+    def test_with_two_underscore_in_format_specifier(self):
+        error_msg = re.escape("Cannot specify '_' with '_'.")
+        with self.assertRaisesRegex(ValueError, error_msg):
+            f'{1:__}'
+
+    def test_with_a_commas_and_an_underscore_in_format_specifier(self):
+        error_msg = re.escape("Cannot specify both ',' and '_'.")
+        with self.assertRaisesRegex(ValueError, error_msg):
+            f'{1:,_}'
+
+    def test_with_an_underscore_and_a_comma_in_format_specifier(self):
+        error_msg = re.escape("Cannot specify both ',' and '_'.")
+        with self.assertRaisesRegex(ValueError, error_msg):
+            f'{1:,_}'
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst b/Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst
new file mode 100644
index 0000000000000..ed557f92d85ca
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-08-31-17-49-02.bpo-41681.3-VJiH.rst	
@@ -0,0 +1,2 @@
+Fixes the wrong error description in the error raised by using 2 `,` in
+format string in f-string and :meth:`str.format`.
diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c
index 74638ca223772..ed95f267d476c 100644
--- a/Python/formatter_unicode.c
+++ b/Python/formatter_unicode.c
@@ -252,8 +252,10 @@ parse_internal_render_format_spec(PyObject *format_spec,
         ++pos;
     }
     if (end-pos && READ_spec(pos) == ',') {
-        invalid_comma_and_underscore();
-        return 0;
+        if (format->thousands_separators == LT_UNDERSCORE_LOCALE) {
+            invalid_comma_and_underscore();
+            return 0;
+        }
     }
 
     /* Parse field precision */



More information about the Python-checkins mailing list