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):
sub = sub.data
return self.data.count(sub, start, end)
def encode(self, encoding=None, errors=None): # XXX improve this?
if encoding:
if errors:
return self.__class__(self.data.encode(encoding, errors))
return self.__class__(self.data.encode(encoding))
return self.__class__(self.data.encode())
def encode(self, encoding='utf-8', errors='strict'):
encoding = 'utf-8' if encoding is None else encoding
errors = 'strict' if errors is None else errors
return self.data.encode(encoding, errors)
def endswith(self, suffix, start=0, end=_sys.maxsize):
return self.data.endswith(suffix, start, end)
def expandtabs(self, tabsize=8):

View File

@ -51,6 +51,20 @@ class UserStringTest(
str3 = ustr3('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__":
unittest.main()

View File

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

View File

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