Browse Source

Refs #32508 -- Raised ValueError instead of using "assert" in lazy().

Hasan Ramezani 4 years ago
parent
commit
775b796d8d
2 changed files with 10 additions and 2 deletions
  1. 4 2
      django/utils/functional.py
  2. 6 0
      tests/utils_tests/test_functional.py

+ 4 - 2
django/utils/functional.py

@@ -119,8 +119,10 @@ def lazy(func, *resultclasses):
                         setattr(cls, method_name, meth)
             cls._delegate_bytes = bytes in resultclasses
             cls._delegate_text = str in resultclasses
-            assert not (cls._delegate_bytes and cls._delegate_text), (
-                "Cannot call lazy() with both bytes and text return types.")
+            if cls._delegate_bytes and cls._delegate_text:
+                raise ValueError(
+                    'Cannot call lazy() with both bytes and text return types.'
+                )
             if cls._delegate_text:
                 cls.__str__ = cls.__text_cast
             elif cls._delegate_bytes:

+ 6 - 0
tests/utils_tests/test_functional.py

@@ -224,6 +224,12 @@ class FunctionalTests(SimpleTestCase):
             lazified()
             mocked.assert_not_called()
 
+    def test_lazy_bytes_and_str_result_classes(self):
+        lazy_obj = lazy(lambda: 'test', str, bytes)
+        msg = 'Cannot call lazy() with both bytes and text return types.'
+        with self.assertRaisesMessage(ValueError, msg):
+            lazy_obj()
+
     def test_classproperty_getter(self):
         class Foo:
             foo_attr = 123