aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2021-01-25 11:56:33 +0200
committerGitHub <noreply@github.com>2021-01-25 11:56:33 +0200
commitcf19cc3b920ca5995e1c202d2c3dd7a59ac8eac8 (patch)
tree114c6f03de6e732ca7b81bd60d48b1a7f7968b33
parent bpo-43013: Update idlelib code to 3.x (GH-24315) (diff)
downloadcpython-cf19cc3b920ca5995e1c202d2c3dd7a59ac8eac8.tar.gz
cpython-cf19cc3b920ca5995e1c202d2c3dd7a59ac8eac8.tar.bz2
cpython-cf19cc3b920ca5995e1c202d2c3dd7a59ac8eac8.zip
bpo-27772: Make preceding width with 0 valid in string format. (GH-11270)
Previously it was an error with confusing error message.
-rw-r--r--Doc/library/string.rst8
-rw-r--r--Lib/test/test_unicode.py6
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2018-12-20-23-59-23.bpo-27772.idHEcj.rst2
-rw-r--r--Python/formatter_unicode.c2
4 files changed, 15 insertions, 3 deletions
diff --git a/Doc/library/string.rst b/Doc/library/string.rst
index 54786d0c2ab..1bfd518349b 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 4f5636e1426..df8f2c92b38 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 00000000000..7345152fee3
--- /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 ed95f267d47..5ccf9d303e3 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;