]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-27772: Make preceding width with 0 valid in string format. (GH-11270)
authorSerhiy Storchaka <storchaka@gmail.com>
Mon, 25 Jan 2021 09:56:33 +0000 (11:56 +0200)
committerGitHub <noreply@github.com>
Mon, 25 Jan 2021 09:56:33 +0000 (11:56 +0200)
Previously it was an error with confusing error message.

Doc/library/string.rst
Lib/test/test_unicode.py
Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst [new file with mode: 0644]
Python/formatter_unicode.c

index 54786d0c2ab0dfb3247f2ea406d3793f0b9a06c6..1bfd518349b3893b8bd394f51c7dc4c637256ed2 100644 (file)
@@ -347,8 +347,8 @@ The meaning of the various alignment options is as follows:
    | ``'='`` | Forces the padding to be placed after the sign (if any)  |
    |         | but before the digits.  This is used for printing fields |
    |         | in the form '+000000120'. This alignment option is only  |
-   |         | valid for numeric types.  It becomes the default when '0'|
-   |         | immediately precedes the field width.                    |
+   |         | valid for numeric types.  It becomes the default for     |
+   |         | numbers when '0' immediately precedes the field width.   |
    +---------+----------------------------------------------------------+
    | ``'^'`` | Forces the field to be centered within the available     |
    |         | space.                                                   |
@@ -424,6 +424,10 @@ When no explicit alignment is given, preceding the *width* field by a zero
 sign-aware zero-padding for numeric types.  This is equivalent to a *fill*
 character of ``'0'`` with an *alignment* type of ``'='``.
 
+.. versionchanged:: 3.10
+   Preceding the *width* field by ``'0'`` no longer affects the default
+   alignment for strings.
+
 The *precision* is a decimal number indicating how many digits should be
 displayed after the decimal point for a floating point value formatted with
 ``'f'`` and ``'F'``, or before and after the decimal point for a floating point
index 4f5636e1426f4df691556f298b32c80559e91a72..df8f2c92b38f887e77a556ba36c2195fa5a562a7 100644 (file)
@@ -1098,6 +1098,12 @@ class UnicodeTest(string_tests.CommonTest,
         self.assertEqual('{0:^8s}'.format('result'), ' result ')
         self.assertEqual('{0:^9s}'.format('result'), ' result  ')
         self.assertEqual('{0:^10s}'.format('result'), '  result  ')
+        self.assertEqual('{0:8s}'.format('result'), 'result  ')
+        self.assertEqual('{0:0s}'.format('result'), 'result')
+        self.assertEqual('{0:08s}'.format('result'), 'result00')
+        self.assertEqual('{0:<08s}'.format('result'), 'result00')
+        self.assertEqual('{0:>08s}'.format('result'), '00result')
+        self.assertEqual('{0:^08s}'.format('result'), '0result0')
         self.assertEqual('{0:10000}'.format('a'), 'a' + ' ' * 9999)
         self.assertEqual('{0:10000}'.format(''), ' ' * 10000)
         self.assertEqual('{0:10000000}'.format(''), ' ' * 10000000)
diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst
new file mode 100644 (file)
index 0000000..7345152
--- /dev/null
@@ -0,0 +1,2 @@
+In string formatting, preceding the *width* field by ``'0'`` no longer
+affects the default alignment for strings.
index ed95f267d476c7bab41e74d81a34afb5fc96b395..5ccf9d303e34ec034d56453b2516afaf56a86609 100644 (file)
@@ -219,7 +219,7 @@ parse_internal_render_format_spec(PyObject *format_spec,
     /* The special case for 0-padding (backwards compat) */
     if (!fill_char_specified && end-pos >= 1 && READ_spec(pos) == '0') {
         format->fill_char = '0';
-        if (!align_specified) {
+        if (!align_specified && default_align == '>') {
             format->align = '=';
         }
         ++pos;