From: Serhiy Storchaka Date: Mon, 25 Jan 2021 09:56:33 +0000 (+0200) Subject: bpo-27772: Make preceding width with 0 valid in string format. (GH-11270) X-Git-Tag: v3.10.0a5~56 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cf19cc3b920ca5995e1c202d2c3dd7a59ac8eac8;p=thirdparty%2FPython%2Fcpython.git bpo-27772: Make preceding width with 0 valid in string format. (GH-11270) Previously it was an error with confusing error message. --- diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 54786d0c2ab0..1bfd518349b3 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -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 diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 4f5636e1426f..df8f2c92b38f 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -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 index 000000000000..7345152fee35 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst @@ -0,0 +1,2 @@ +In string formatting, preceding the *width* field by ``'0'`` no longer +affects the default alignment for strings. diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c index ed95f267d476..5ccf9d303e34 100644 --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -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;