[Python-checkins] cpython (merge 3.6 -> default): Issue #29000: Fixed bytes formatting of octals with zero padding in alternate

serhiy.storchaka python-checkins at python.org
Sat Dec 17 15:16:45 EST 2016


https://hg.python.org/cpython/rev/4e55e011dd80
changeset:   105710:4e55e011dd80
parent:      105704:1756beed417c
parent:      105709:29c9c414c310
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sat Dec 17 22:15:10 2016 +0200
summary:
  Issue #29000: Fixed bytes formatting of octals with zero padding in alternate
form.

files:
  Lib/test/test_format.py |  34 ++++++++++++++++++++++------
  Misc/NEWS               |   3 ++
  Objects/bytesobject.c   |   5 +--
  3 files changed, 31 insertions(+), 11 deletions(-)


diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py
--- a/Lib/test/test_format.py
+++ b/Lib/test/test_format.py
@@ -114,6 +114,7 @@
         testcommon("%o", 100000000000, "1351035564000")
         testcommon("%d", 10, "10")
         testcommon("%d", 100000000000, "100000000000")
+
         big = 123456789012345678901234567890
         testcommon("%d", big, "123456789012345678901234567890")
         testcommon("%d", -big, "-123456789012345678901234567890")
@@ -133,6 +134,7 @@
         testcommon("%.31d", big, "0123456789012345678901234567890")
         testcommon("%32.31d", big, " 0123456789012345678901234567890")
         testcommon("%d", float(big), "123456________________________", 6)
+
         big = 0x1234567890abcdef12345  # 21 hex digits
         testcommon("%x", big, "1234567890abcdef12345")
         testcommon("%x", -big, "-1234567890abcdef12345")
@@ -156,19 +158,26 @@
         testcommon("%#X", big, "0X1234567890ABCDEF12345")
         testcommon("%#x", big, "0x1234567890abcdef12345")
         testcommon("%#x", -big, "-0x1234567890abcdef12345")
+        testcommon("%#27x", big, "    0x1234567890abcdef12345")
+        testcommon("%#-27x", big, "0x1234567890abcdef12345    ")
+        testcommon("%#027x", big, "0x00001234567890abcdef12345")
+        testcommon("%#.23x", big, "0x001234567890abcdef12345")
         testcommon("%#.23x", -big, "-0x001234567890abcdef12345")
+        testcommon("%#27.23x", big, "  0x001234567890abcdef12345")
+        testcommon("%#-27.23x", big, "0x001234567890abcdef12345  ")
+        testcommon("%#027.23x", big, "0x00001234567890abcdef12345")
         testcommon("%#+.23x", big, "+0x001234567890abcdef12345")
         testcommon("%# .23x", big, " 0x001234567890abcdef12345")
         testcommon("%#+.23X", big, "+0X001234567890ABCDEF12345")
-        testcommon("%#-+.23X", big, "+0X001234567890ABCDEF12345")
-        testcommon("%#-+26.23X", big, "+0X001234567890ABCDEF12345")
-        testcommon("%#-+27.23X", big, "+0X001234567890ABCDEF12345 ")
-        testcommon("%#+27.23X", big, " +0X001234567890ABCDEF12345")
         # next one gets two leading zeroes from precision, and another from the
         # 0 flag and the width
         testcommon("%#+027.23X", big, "+0X0001234567890ABCDEF12345")
+        testcommon("%# 027.23X", big, " 0X0001234567890ABCDEF12345")
         # same, except no 0 flag
         testcommon("%#+27.23X", big, " +0X001234567890ABCDEF12345")
+        testcommon("%#-+27.23x", big, "+0x001234567890abcdef12345 ")
+        testcommon("%#- 27.23x", big, " 0x001234567890abcdef12345 ")
+
         big = 0o12345670123456701234567012345670  # 32 octal digits
         testcommon("%o", big, "12345670123456701234567012345670")
         testcommon("%o", -big, "-12345670123456701234567012345670")
@@ -191,13 +200,21 @@
         testcommon("%o", big, "12345670123456701234567012345670")
         testcommon("%#o", big, "0o12345670123456701234567012345670")
         testcommon("%#o", -big, "-0o12345670123456701234567012345670")
+        testcommon("%#38o", big, "    0o12345670123456701234567012345670")
+        testcommon("%#-38o", big, "0o12345670123456701234567012345670    ")
+        testcommon("%#038o", big, "0o000012345670123456701234567012345670")
+        testcommon("%#.34o", big, "0o0012345670123456701234567012345670")
         testcommon("%#.34o", -big, "-0o0012345670123456701234567012345670")
+        testcommon("%#38.34o", big, "  0o0012345670123456701234567012345670")
+        testcommon("%#-38.34o", big, "0o0012345670123456701234567012345670  ")
+        testcommon("%#038.34o", big, "0o000012345670123456701234567012345670")
         testcommon("%#+.34o", big, "+0o0012345670123456701234567012345670")
         testcommon("%# .34o", big, " 0o0012345670123456701234567012345670")
-        testcommon("%#+.34o", big, "+0o0012345670123456701234567012345670")
-        testcommon("%#-+.34o", big, "+0o0012345670123456701234567012345670")
-        testcommon("%#-+37.34o", big, "+0o0012345670123456701234567012345670")
-        testcommon("%#+37.34o", big, "+0o0012345670123456701234567012345670")
+        testcommon("%#+38.34o", big, " +0o0012345670123456701234567012345670")
+        testcommon("%#-+38.34o", big, "+0o0012345670123456701234567012345670 ")
+        testcommon("%#- 38.34o", big, " 0o0012345670123456701234567012345670 ")
+        testcommon("%#+038.34o", big, "+0o00012345670123456701234567012345670")
+        testcommon("%# 038.34o", big, " 0o00012345670123456701234567012345670")
         # next one gets one leading zero from precision
         testcommon("%.33o", big, "012345670123456701234567012345670")
         # base marker added in spite of leading zero (different to Python 2)
@@ -208,6 +225,7 @@
         testcommon("%035.33o", big, "00012345670123456701234567012345670")
         # base marker shouldn't change the size
         testcommon("%0#35.33o", big, "0o012345670123456701234567012345670")
+
         # Some small ints, in both Python int and flavors).
         testcommon("%d", 42, "42")
         testcommon("%d", -42, "-42")
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
 Core and Builtins
 -----------------
 
+- Issue #29000: Fixed bytes formatting of octals with zero padding in alternate
+  form.
+
 - Issue #18896: Python function can now have more than 255 parameters.
   collections.namedtuple() now supports tuples with more than 255 elements.
 
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -974,7 +974,7 @@
             /* Write the numeric prefix for "x", "X" and "o" formats
                if the alternate form is used.
                For example, write "0x" for the "%#x" format. */
-            if ((flags & F_ALT) && (c == 'x' || c == 'X')) {
+            if ((flags & F_ALT) && (c == 'o' || c == 'x' || c == 'X')) {
                 assert(pbuf[0] == '0');
                 assert(pbuf[1] == c);
                 if (fill != ' ') {
@@ -999,8 +999,7 @@
             if (fill == ' ') {
                 if (sign)
                     *res++ = sign;
-                if ((flags & F_ALT) &&
-                    (c == 'x' || c == 'X')) {
+                if ((flags & F_ALT) && (c == 'o' || c == 'x' || c == 'X')) {
                     assert(pbuf[0] == '0');
                     assert(pbuf[1] == c);
                     *res++ = *pbuf++;

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list