Issue #24731: Fixed crash on converting objects with special methods

__bytes__, __trunc__, and __float__ returning instances of subclasses of
bytes, int, and float to subclasses of bytes, int, and float correspondingly.
This commit is contained in:
Serhiy Storchaka 2015-11-25 15:52:04 +02:00
commit f9afda57ad
8 changed files with 50 additions and 10 deletions

View file

@ -43,6 +43,9 @@ def duplicate_string(text):
"""
return text.encode().decode()
class StrSubclass(str):
pass
class UnicodeTest(string_tests.CommonTest,
string_tests.MixinStrUnicodeUserStringTest,
string_tests.MixinStrUnicodeTest,
@ -1441,11 +1444,8 @@ class UnicodeTest(string_tests.CommonTest,
'unicode remains unicode'
)
class UnicodeSubclass(str):
pass
for text in ('ascii', '\xe9', '\u20ac', '\U0010FFFF'):
subclass = UnicodeSubclass(text)
subclass = StrSubclass(text)
self.assertEqual(str(subclass), text)
self.assertEqual(len(subclass), len(text))
if text == 'ascii':
@ -2199,6 +2199,9 @@ class UnicodeTest(string_tests.CommonTest,
s = str(StrSubclassToStrSubclass("foo"))
self.assertEqual(s, "foofoo")
self.assertIs(type(s), StrSubclassToStrSubclass)
s = StrSubclass(StrSubclassToStrSubclass("foo"))
self.assertEqual(s, "foofoo")
self.assertIs(type(s), StrSubclass)
def test_unicode_repr(self):
class s1: