bpo-36582: Make collections.UserString.encode() return bytes, not str (GH-13138)

This commit is contained in:
Daniel Fortunov 2019-08-28 06:38:09 +02:00 committed by Raymond Hettinger
parent 98d90f745d
commit 2a16eea71f
4 changed files with 20 additions and 6 deletions

View File

@ -1184,12 +1184,10 @@ class UserString(_collections_abc.Sequence):
if isinstance(sub, UserString): if isinstance(sub, UserString):
sub = sub.data sub = sub.data
return self.data.count(sub, start, end) return self.data.count(sub, start, end)
def encode(self, encoding=None, errors=None): # XXX improve this? def encode(self, encoding='utf-8', errors='strict'):
if encoding: encoding = 'utf-8' if encoding is None else encoding
if errors: errors = 'strict' if errors is None else errors
return self.__class__(self.data.encode(encoding, errors)) return self.data.encode(encoding, errors)
return self.__class__(self.data.encode(encoding))
return self.__class__(self.data.encode())
def endswith(self, suffix, start=0, end=_sys.maxsize): def endswith(self, suffix, start=0, end=_sys.maxsize):
return self.data.endswith(suffix, start, end) return self.data.endswith(suffix, start, end)
def expandtabs(self, tabsize=8): def expandtabs(self, tabsize=8):

View File

@ -51,6 +51,20 @@ class UserStringTest(
str3 = ustr3('TEST') str3 = ustr3('TEST')
self.assertEqual(fmt2 % str3, 'value is TEST') self.assertEqual(fmt2 % str3, 'value is TEST')
def test_encode_default_args(self):
self.checkequal(b'hello', 'hello', 'encode')
# Check that encoding defaults to utf-8
self.checkequal(b'\xf0\xa3\x91\x96', '\U00023456', 'encode')
# Check that errors defaults to 'strict'
self.checkraises(UnicodeError, '\ud800', 'encode')
def test_encode_explicit_none_args(self):
self.checkequal(b'hello', 'hello', 'encode', None, None)
# Check that encoding defaults to utf-8
self.checkequal(b'\xf0\xa3\x91\x96', '\U00023456', 'encode', None, None)
# Check that errors defaults to 'strict'
self.checkraises(UnicodeError, '\ud800', 'encode', None, None)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -512,6 +512,7 @@ Arnaud Fontaine
Michael Foord Michael Foord
Amaury Forgeot d'Arc Amaury Forgeot d'Arc
Doug Fort Doug Fort
Daniel Fortunov
Evens Fortuné Evens Fortuné
Chris Foster Chris Foster
John Fouhy John Fouhy

View File

@ -0,0 +1 @@
Fix ``UserString.encode()`` to correctly return ``bytes`` rather than a ``UserString`` instance.