Fixed #30498 -- Fixed proxy class caching in lazy().
lazy() should prepare the proxy class only once (the first time it's
used) not on every call.
Regression in b4e76f30d1
.
This commit is contained in:
parent
b711eafd2a
commit
a2c31e12da
|
@ -79,7 +79,7 @@ def lazy(func, *resultclasses):
|
||||||
self.__kw = kw
|
self.__kw = kw
|
||||||
if not self.__prepared:
|
if not self.__prepared:
|
||||||
self.__prepare_class__()
|
self.__prepare_class__()
|
||||||
self.__prepared = True
|
self.__class__.__prepared = True
|
||||||
|
|
||||||
def __reduce__(self):
|
def __reduce__(self):
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
from django.test import SimpleTestCase
|
from django.test import SimpleTestCase
|
||||||
from django.utils.functional import cached_property, lazy
|
from django.utils.functional import cached_property, lazy
|
||||||
|
|
||||||
|
@ -207,3 +209,12 @@ class FunctionalTests(SimpleTestCase):
|
||||||
original_object = b'J\xc3\xbcst a str\xc3\xadng'
|
original_object = b'J\xc3\xbcst a str\xc3\xadng'
|
||||||
lazy_obj = lazy(lambda: original_object, bytes)
|
lazy_obj = lazy(lambda: original_object, bytes)
|
||||||
self.assertEqual(repr(original_object), repr(lazy_obj()))
|
self.assertEqual(repr(original_object), repr(lazy_obj()))
|
||||||
|
|
||||||
|
def test_lazy_class_preparation_caching(self):
|
||||||
|
# lazy() should prepare the proxy class only once i.e. the first time
|
||||||
|
# it's used.
|
||||||
|
lazified = lazy(lambda: 0, int)
|
||||||
|
__proxy__ = lazified().__class__
|
||||||
|
with mock.patch.object(__proxy__, '__prepare_class__') as mocked:
|
||||||
|
lazified()
|
||||||
|
mocked.assert_not_called()
|
||||||
|
|
Loading…
Reference in New Issue