Skip to content

Commit 8790325

Browse files
committed
address review: use z option for twos complement interpretation
1 parent 837ebbf commit 8790325

File tree

3 files changed

+23
-19
lines changed

3 files changed

+23
-19
lines changed

Lib/test/test_format.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -620,9 +620,10 @@ def test_specifier_z_error(self):
620620
with self.assertRaisesRegex(ValueError, error_msg):
621621
f"{0:fz}" # wrong position
622622

623-
error_msg = re.escape("Negative zero coercion (z) not allowed")
623+
error_msg = re.escape("'z' option not allowed with 'c', 'd' and 'n'")
624624
with self.assertRaisesRegex(ValueError, error_msg):
625625
f"{0:zd}" # can't apply to int presentation type
626+
error_msg = re.escape("Negative zero coercion (z) not allowed")
626627
with self.assertRaisesRegex(ValueError, error_msg):
627628
f"{'x':zs}" # can't apply to string
628629

Lib/test/test_long.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -707,9 +707,9 @@ def test__format__(self):
707707
self.assertRaises(ValueError, format, 1234567890, ',x')
708708
self.assertEqual(format(1234567890, '_x'), '4996_02d2')
709709
self.assertEqual(format(1234567890, '_X'), '4996_02D2')
710-
self.assertEqual(format(8086, '#.8x'), '0x00001f96')
711-
self.assertEqual(format(2048, '.3x'), '0800')
712-
self.assertEqual(format(-2049, '.3x'), '17ff')
710+
self.assertEqual(format(8086, 'z#.8x'), '0x00001f96')
711+
self.assertEqual(format(2048, 'z.3x'), '0800')
712+
self.assertEqual(format(-2049, 'z.3x'), '17ff')
713713

714714
# octal
715715
self.assertEqual(format(3, "o"), "3")
@@ -724,9 +724,9 @@ def test__format__(self):
724724
self.assertEqual(format(-1234, "+o"), "-2322")
725725
self.assertRaises(ValueError, format, 1234567890, ',o')
726726
self.assertEqual(format(1234567890, '_o'), '111_4540_1322')
727-
self.assertEqual(format(18, '#.3o'), '0o022')
728-
self.assertEqual(format(256, '.3o'), '0400')
729-
self.assertEqual(format(-257, '.3o'), '1377')
727+
self.assertEqual(format(18, 'z#.3o'), '0o022')
728+
self.assertEqual(format(256, 'z.3o'), '0400')
729+
self.assertEqual(format(-257, 'z.3o'), '1377')
730730

731731
# binary
732732
self.assertEqual(format(3, "b"), "11")
@@ -741,13 +741,13 @@ def test__format__(self):
741741
self.assertEqual(format(-1234, "+b"), "-10011010010")
742742
self.assertRaises(ValueError, format, 1234567890, ',b')
743743
self.assertEqual(format(12345, '_b'), '11_0000_0011_1001')
744-
self.assertEqual(format(-12, '.8b'), '11110100')
745-
self.assertEqual(format(73, '.8b'), '01001001')
746-
self.assertEqual(format(73, '#.8b'), '0b01001001')
747-
self.assertEqual(format(300, '.8b'), '100101100')
748-
self.assertEqual(format(-200, '.8b'), '100111000')
749-
self.assertEqual(format(128, '.8b'), '010000000')
750-
self.assertEqual(format(-129, '.8b'), '101111111')
744+
self.assertEqual(format(-12, 'z.8b'), '11110100')
745+
self.assertEqual(format(73, 'z.8b'), '01001001')
746+
self.assertEqual(format(73, 'z#.8b'), '0b01001001')
747+
self.assertEqual(format(300, 'z.8b'), '100101100')
748+
self.assertEqual(format(-200, 'z.8b'), '100111000')
749+
self.assertEqual(format(128, 'z.8b'), '010000000')
750+
self.assertEqual(format(-129, 'z.8b'), '101111111')
751751

752752
# make sure these are errors
753753
self.assertRaises(ValueError, format, 3, "1.3c") # precision disallowed with 'c',

Python/formatter_unicode.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -988,10 +988,12 @@ format_long_internal(PyObject *value, const InternalFormatSpec *format,
988988
}
989989

990990
/* no negative zero coercion on integers */
991-
if (format->no_neg_0) {
991+
if (format->no_neg_0 && format->type != 'b' && format->type != 'o'
992+
&& format->type != 'x' && format->type != 'X')
993+
{
992994
PyErr_SetString(PyExc_ValueError,
993-
"Negative zero coercion (z) not allowed in integer"
994-
" format specifier");
995+
"'z' option not allowed with 'c', 'd' and 'n' "
996+
"integer format specifier");
995997
goto done;
996998
}
997999

@@ -1084,8 +1086,9 @@ format_long_internal(PyObject *value, const InternalFormatSpec *format,
10841086
int64_t precision = Py_MAX(1, format->precision);
10851087

10861088
/* Use two's complement for 'b', 'o' and 'x' formatting types */
1087-
if (format->type == 'b' || format->type == 'x'
1088-
|| format->type == 'o' || format->type == 'X')
1089+
if (format->no_neg_0 && (format->type == 'b' || format->type == 'x'
1090+
|| format->type == 'o'
1091+
|| format->type == 'X'))
10891092
{
10901093
int64_t shift = precision;
10911094
int incr = 1;

0 commit comments

Comments
 (0)