Closes issue #12546: Allow \x00 as a fill character for builtin type __format__ methods.
This commit is contained in:
commit
280c458f9e
|
@ -874,6 +874,27 @@ class UnicodeTest(string_tests.CommonTest,
|
||||||
self.assertEqual('{0:10000}'.format(''), ' ' * 10000)
|
self.assertEqual('{0:10000}'.format(''), ' ' * 10000)
|
||||||
self.assertEqual('{0:10000000}'.format(''), ' ' * 10000000)
|
self.assertEqual('{0:10000000}'.format(''), ' ' * 10000000)
|
||||||
|
|
||||||
|
# issue 12546: use \x00 as a fill character
|
||||||
|
self.assertEqual('{0:\x00<6s}'.format('foo'), 'foo\x00\x00\x00')
|
||||||
|
self.assertEqual('{0:\x01<6s}'.format('foo'), 'foo\x01\x01\x01')
|
||||||
|
self.assertEqual('{0:\x00^6s}'.format('foo'), '\x00foo\x00\x00')
|
||||||
|
self.assertEqual('{0:^6s}'.format('foo'), ' foo ')
|
||||||
|
|
||||||
|
self.assertEqual('{0:\x00<6}'.format(3), '3\x00\x00\x00\x00\x00')
|
||||||
|
self.assertEqual('{0:\x01<6}'.format(3), '3\x01\x01\x01\x01\x01')
|
||||||
|
self.assertEqual('{0:\x00^6}'.format(3), '\x00\x003\x00\x00\x00')
|
||||||
|
self.assertEqual('{0:<6}'.format(3), '3 ')
|
||||||
|
|
||||||
|
self.assertEqual('{0:\x00<6}'.format(3.14), '3.14\x00\x00')
|
||||||
|
self.assertEqual('{0:\x01<6}'.format(3.14), '3.14\x01\x01')
|
||||||
|
self.assertEqual('{0:\x00^6}'.format(3.14), '\x003.14\x00')
|
||||||
|
self.assertEqual('{0:^6}'.format(3.14), ' 3.14 ')
|
||||||
|
|
||||||
|
self.assertEqual('{0:\x00<12}'.format(3+2.0j), '(3+2j)\x00\x00\x00\x00\x00\x00')
|
||||||
|
self.assertEqual('{0:\x01<12}'.format(3+2.0j), '(3+2j)\x01\x01\x01\x01\x01\x01')
|
||||||
|
self.assertEqual('{0:\x00^12}'.format(3+2.0j), '\x00\x00\x00(3+2j)\x00\x00\x00')
|
||||||
|
self.assertEqual('{0:^12}'.format(3+2.0j), ' (3+2j) ')
|
||||||
|
|
||||||
# format specifiers for user defined type
|
# format specifiers for user defined type
|
||||||
self.assertEqual('{0:abc}'.format(C()), 'abc')
|
self.assertEqual('{0:abc}'.format(C()), 'abc')
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,9 @@ Core and Builtins
|
||||||
|
|
||||||
- Issue #19995: %c, %o, %x, and %X now raise TypeError on non-integer input.
|
- Issue #19995: %c, %o, %x, and %X now raise TypeError on non-integer input.
|
||||||
|
|
||||||
|
- Issue #12546: Allow \x00 to be used as a fill character when using str, int,
|
||||||
|
float, and complex __format__ methods.
|
||||||
|
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
|
|
@ -156,8 +156,9 @@ parse_internal_render_format_spec(PyObject *format_spec,
|
||||||
|
|
||||||
Py_ssize_t consumed;
|
Py_ssize_t consumed;
|
||||||
int align_specified = 0;
|
int align_specified = 0;
|
||||||
|
int fill_char_specified = 0;
|
||||||
|
|
||||||
format->fill_char = '\0';
|
format->fill_char = ' ';
|
||||||
format->align = default_align;
|
format->align = default_align;
|
||||||
format->alternate = 0;
|
format->alternate = 0;
|
||||||
format->sign = '\0';
|
format->sign = '\0';
|
||||||
|
@ -171,6 +172,7 @@ parse_internal_render_format_spec(PyObject *format_spec,
|
||||||
if (end-pos >= 2 && is_alignment_token(READ_spec(pos+1))) {
|
if (end-pos >= 2 && is_alignment_token(READ_spec(pos+1))) {
|
||||||
format->align = READ_spec(pos+1);
|
format->align = READ_spec(pos+1);
|
||||||
format->fill_char = READ_spec(pos);
|
format->fill_char = READ_spec(pos);
|
||||||
|
fill_char_specified = 1;
|
||||||
align_specified = 1;
|
align_specified = 1;
|
||||||
pos += 2;
|
pos += 2;
|
||||||
}
|
}
|
||||||
|
@ -194,7 +196,7 @@ parse_internal_render_format_spec(PyObject *format_spec,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The special case for 0-padding (backwards compat) */
|
/* The special case for 0-padding (backwards compat) */
|
||||||
if (format->fill_char == '\0' && end-pos >= 1 && READ_spec(pos) == '0') {
|
if (!fill_char_specified && end-pos >= 1 && READ_spec(pos) == '0') {
|
||||||
format->fill_char = '0';
|
format->fill_char = '0';
|
||||||
if (!align_specified) {
|
if (!align_specified) {
|
||||||
format->align = '=';
|
format->align = '=';
|
||||||
|
@ -784,9 +786,7 @@ format_string_internal(PyObject *value, const InternalFormatSpec *format,
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
/* Write into that space. First the padding. */
|
/* Write into that space. First the padding. */
|
||||||
result = fill_padding(writer, len,
|
result = fill_padding(writer, len, format->fill_char, lpad, rpad);
|
||||||
format->fill_char=='\0'?' ':format->fill_char,
|
|
||||||
lpad, rpad);
|
|
||||||
if (result == -1)
|
if (result == -1)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
@ -956,8 +956,7 @@ format_long_internal(PyObject *value, const InternalFormatSpec *format,
|
||||||
/* Populate the memory. */
|
/* Populate the memory. */
|
||||||
result = fill_number(writer, &spec,
|
result = fill_number(writer, &spec,
|
||||||
tmp, inumeric_chars, inumeric_chars + n_digits,
|
tmp, inumeric_chars, inumeric_chars + n_digits,
|
||||||
tmp, prefix,
|
tmp, prefix, format->fill_char,
|
||||||
format->fill_char == '\0' ? ' ' : format->fill_char,
|
|
||||||
&locale, format->type == 'X');
|
&locale, format->type == 'X');
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
@ -1104,8 +1103,7 @@ format_float_internal(PyObject *value,
|
||||||
/* Populate the memory. */
|
/* Populate the memory. */
|
||||||
result = fill_number(writer, &spec,
|
result = fill_number(writer, &spec,
|
||||||
unicode_tmp, index, index + n_digits,
|
unicode_tmp, index, index + n_digits,
|
||||||
NULL, 0,
|
NULL, 0, format->fill_char,
|
||||||
format->fill_char == '\0' ? ' ' : format->fill_char,
|
|
||||||
&locale, 0);
|
&locale, 0);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
@ -1311,8 +1309,7 @@ format_complex_internal(PyObject *value,
|
||||||
/* Populate the memory. First, the padding. */
|
/* Populate the memory. First, the padding. */
|
||||||
result = fill_padding(writer,
|
result = fill_padding(writer,
|
||||||
n_re_total + n_im_total + 1 + add_parens * 2,
|
n_re_total + n_im_total + 1 + add_parens * 2,
|
||||||
format->fill_char=='\0' ? ' ' : format->fill_char,
|
format->fill_char, lpad, rpad);
|
||||||
lpad, rpad);
|
|
||||||
if (result == -1)
|
if (result == -1)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue