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' % 'はい'.encode('utf-8') == b'\xe3\x81\xaf\xe3\x81\x84' + assert b'%b' % u'はい'.encode('utf-8') == u'はい'.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