Author: Richard Plangger <planri...@gmail.com>
Branch: py3.5-byteformat
Changeset: r86771:45a8ee6fd44d
Date: 2016-08-31 10:58 +0200
http://bitbucket.org/pypy/pypy/changeset/45a8ee6fd44d/

Log:    add test and impl %b format

diff --git a/pypy/objspace/std/formatting.py b/pypy/objspace/std/formatting.py
--- a/pypy/objspace/std/formatting.py
+++ b/pypy/objspace/std/formatting.py
@@ -478,7 +478,27 @@
                     self.std_wp(s)
 
         def fmt_b(self, w_value):
-            raise NotImplementedError
+            space = self.space
+            # cpython explicitly checks for bytes & bytearray
+            if space.isinstance_w(w_value, space.w_bytes):
+                self.std_wp(space.bytes_w(w_value))
+                return
+            if space.isinstance_w(w_value, space.w_bytearray):
+                self.std_wp(space.bytes_w(w_value))
+                return
+
+            w_bytes_method = space.lookup(w_value, "__bytes__")
+            if w_bytes_method is not None:
+                w_bytes = space.get_and_call_function(w_bytes_method, w_value)
+                if not space.isinstance_w(w_bytes, space.w_bytes):
+                    raise oefmt(space.w_TypeError,
+                                "__bytes__ returned non-bytes (type '%T')", 
w_bytes)
+                self.std_wp(space.bytes_w(w_bytes))
+                return
+
+            raise oefmt(space.w_TypeError,
+                    "requires bytes, or an object that" \
+                    "implements __bytes__, not '%T'", w_value)
 
     return StringFormatter
 
diff --git a/pypy/objspace/std/test/test_bytesobject.py 
b/pypy/objspace/std/test/test_bytesobject.py
--- a/pypy/objspace/std/test/test_bytesobject.py
+++ b/pypy/objspace/std/test/test_bytesobject.py
@@ -1,3 +1,4 @@
+# coding: utf-8
 class TestW_BytesObject:
 
     def teardown_method(self, method):
@@ -880,8 +881,12 @@
         assert b'%04X' % 10 == b'000A'
         assert b'%c' % 48 == b'0'
         assert b'%c' % b'a' == b'a'
+        """
+
+    def test_format_b(self):
+        """
         assert b'%b' % b'abc' == b'abc'
-        assert b'%b' % '&#12399;&#12356;'.encode('utf-8') == 
b'\xe3\x81\xaf\xe3\x81\x84'
+        assert b'%b' % u'&#12399;&#12356;'.encode('utf-8') == 
u'&#12399;&#12356;'.encode('utf-8')
         raises(TypeError, 'b"%b" % 3.14')
         raises(TypeError, 'b"%b" % "hello world"')
         """
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to