Fixed #34445 -- Fixed string-casting of non-string lazy objects.

This removes __text_cast() as it's the same as __cast().
_delegate_bytes and __delegate_text are mutually exclusive so the
`if self._delegate_bytes` branch in __cast() is unreachable.

Co-Authored-By: David Sanders <shang.xiao.sanders@gmail.com>
This commit is contained in:
Ran Benita 2019-05-03 12:58:12 +03:00 committed by Mariusz Felisiak
parent 0a132de7eb
commit 066aabcb77
2 changed files with 6 additions and 8 deletions

View File

@ -125,9 +125,8 @@ def lazy(func, *resultclasses):
raise ValueError( raise ValueError(
"Cannot call lazy() with both bytes and text return types." "Cannot call lazy() with both bytes and text return types."
) )
if cls._delegate_text:
cls.__str__ = cls.__text_cast if cls._delegate_bytes:
elif cls._delegate_bytes:
cls.__bytes__ = cls.__bytes_cast cls.__bytes__ = cls.__bytes_cast
@classmethod @classmethod
@ -141,17 +140,12 @@ def lazy(func, *resultclasses):
return __wrapper__ return __wrapper__
def __text_cast(self):
return func(*self.__args, **self.__kw)
def __bytes_cast(self): def __bytes_cast(self):
return bytes(func(*self.__args, **self.__kw)) return bytes(func(*self.__args, **self.__kw))
def __cast(self): def __cast(self):
if self._delegate_bytes: if self._delegate_bytes:
return self.__bytes_cast() return self.__bytes_cast()
elif self._delegate_text:
return self.__text_cast()
else: else:
return func(*self.__args, **self.__kw) return func(*self.__args, **self.__kw)

View File

@ -233,6 +233,10 @@ class FunctionalTests(SimpleTestCase):
with self.assertRaisesMessage(ValueError, msg): with self.assertRaisesMessage(ValueError, msg):
lazy_obj() lazy_obj()
def test_lazy_str_cast_mixed_result_types(self):
lazy_value = lazy(lambda: [1], str, list)()
self.assertEqual(str(lazy_value), "[1]")
def test_classproperty_getter(self): def test_classproperty_getter(self):
class Foo: class Foo:
foo_attr = 123 foo_attr = 123