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

(cherry picked from commit 2a16eea71f)

Co-authored-by: Daniel Fortunov <asqui@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2019-08-27 21:59:54 -07:00 committed by Raymond Hettinger
parent 03c52f2f63
commit 2cb82d2a88
4 changed files with 20 additions and 6 deletions

View File

@ -1200,12 +1200,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

@ -509,6 +509,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.