mirror of
https://github.com/django/django.git
synced 2025-06-05 11:39:13 +00:00
Fixed #30127 -- Deprecated name argument of cached_property().
This commit is contained in:
parent
bf7afe9c4e
commit
068b2c072b
@ -1,6 +1,7 @@
|
|||||||
import copy
|
import copy
|
||||||
import itertools
|
import itertools
|
||||||
import operator
|
import operator
|
||||||
|
import warnings
|
||||||
from functools import total_ordering, wraps
|
from functools import total_ordering, wraps
|
||||||
|
|
||||||
|
|
||||||
@ -11,8 +12,6 @@ class cached_property:
|
|||||||
|
|
||||||
A cached property can be made out of an existing method:
|
A cached property can be made out of an existing method:
|
||||||
(e.g. ``url = cached_property(get_absolute_url)``).
|
(e.g. ``url = cached_property(get_absolute_url)``).
|
||||||
The optional ``name`` argument is obsolete as of Python 3.6 and will be
|
|
||||||
deprecated in Django 4.0 (#30127).
|
|
||||||
"""
|
"""
|
||||||
name = None
|
name = None
|
||||||
|
|
||||||
@ -24,6 +23,15 @@ class cached_property:
|
|||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, func, name=None):
|
def __init__(self, func, name=None):
|
||||||
|
from django.utils.deprecation import RemovedInDjango50Warning
|
||||||
|
|
||||||
|
if name is not None:
|
||||||
|
warnings.warn(
|
||||||
|
"The name argument is deprecated as it's unnecessary as of "
|
||||||
|
"Python 3.6.",
|
||||||
|
RemovedInDjango50Warning,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
self.real_func = func
|
self.real_func = func
|
||||||
self.__doc__ = getattr(func, '__doc__')
|
self.__doc__ = getattr(func, '__doc__')
|
||||||
|
|
||||||
|
@ -69,6 +69,9 @@ details on these changes.
|
|||||||
|
|
||||||
* The ``CSRF_COOKIE_MASKED`` transitional setting will be removed.
|
* The ``CSRF_COOKIE_MASKED`` transitional setting will be removed.
|
||||||
|
|
||||||
|
* The ``name`` argument of ``django.utils.functional.cached_property()`` will
|
||||||
|
be removed.
|
||||||
|
|
||||||
.. _deprecation-removed-in-4.1:
|
.. _deprecation-removed-in-4.1:
|
||||||
|
|
||||||
4.1
|
4.1
|
||||||
|
@ -508,6 +508,11 @@ https://web.archive.org/web/20110718035220/http://diveintomark.org/archives/2004
|
|||||||
z = person.friends # does not call
|
z = person.friends # does not call
|
||||||
x is z # is True
|
x is z # is True
|
||||||
|
|
||||||
|
.. deprecated:: 4.1
|
||||||
|
|
||||||
|
The ``name`` parameter is deprecated and will be removed in Django 5.0
|
||||||
|
as it's unnecessary as of Python 3.6.
|
||||||
|
|
||||||
.. class:: classproperty(method=None)
|
.. class:: classproperty(method=None)
|
||||||
|
|
||||||
Similar to :py:func:`@classmethod <classmethod>`, the ``@classproperty``
|
Similar to :py:func:`@classmethod <classmethod>`, the ``@classproperty``
|
||||||
|
@ -346,6 +346,9 @@ Miscellaneous
|
|||||||
|
|
||||||
* ``CSRF_COOKIE_MASKED`` transitional setting is deprecated.
|
* ``CSRF_COOKIE_MASKED`` transitional setting is deprecated.
|
||||||
|
|
||||||
|
* The ``name`` argument of :func:`django.utils.functional.cached_property` is
|
||||||
|
deprecated as it's unnecessary as of Python 3.6.
|
||||||
|
|
||||||
Features removed in 4.1
|
Features removed in 4.1
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
from django.test import SimpleTestCase
|
from django.test import SimpleTestCase
|
||||||
|
from django.test.utils import ignore_warnings
|
||||||
|
from django.utils.deprecation import RemovedInDjango50Warning
|
||||||
from django.utils.functional import cached_property, classproperty, lazy
|
from django.utils.functional import cached_property, classproperty, lazy
|
||||||
|
|
||||||
|
|
||||||
@ -97,12 +99,36 @@ class FunctionalTests(SimpleTestCase):
|
|||||||
"""Here is the docstring..."""
|
"""Here is the docstring..."""
|
||||||
return 1, object()
|
return 1, object()
|
||||||
|
|
||||||
other = cached_property(other_value, name='other')
|
other = cached_property(other_value)
|
||||||
|
|
||||||
attrs = ['value', 'other', '__foo__']
|
attrs = ['value', 'other', '__foo__']
|
||||||
for attr in attrs:
|
for attr in attrs:
|
||||||
self.assertCachedPropertyWorks(attr, Class)
|
self.assertCachedPropertyWorks(attr, Class)
|
||||||
|
|
||||||
|
@ignore_warnings(category=RemovedInDjango50Warning)
|
||||||
|
def test_cached_property_name(self):
|
||||||
|
class Class:
|
||||||
|
def other_value(self):
|
||||||
|
"""Here is the docstring..."""
|
||||||
|
return 1, object()
|
||||||
|
|
||||||
|
other = cached_property(other_value, name='other')
|
||||||
|
other2 = cached_property(other_value, name='different_name')
|
||||||
|
|
||||||
|
self.assertCachedPropertyWorks('other', Class)
|
||||||
|
# An explicit name is ignored.
|
||||||
|
obj = Class()
|
||||||
|
obj.other2
|
||||||
|
self.assertFalse(hasattr(obj, 'different_name'))
|
||||||
|
|
||||||
|
def test_cached_property_name_deprecation_warning(self):
|
||||||
|
def value(self):
|
||||||
|
return 1
|
||||||
|
|
||||||
|
msg = "The name argument is deprecated as it's unnecessary as of Python 3.6."
|
||||||
|
with self.assertWarnsMessage(RemovedInDjango50Warning, msg):
|
||||||
|
cached_property(value, name='other_name')
|
||||||
|
|
||||||
def test_cached_property_auto_name(self):
|
def test_cached_property_auto_name(self):
|
||||||
"""
|
"""
|
||||||
cached_property caches its value and behaves like a property
|
cached_property caches its value and behaves like a property
|
||||||
@ -119,17 +145,11 @@ class FunctionalTests(SimpleTestCase):
|
|||||||
return 1, object()
|
return 1, object()
|
||||||
|
|
||||||
other = cached_property(other_value)
|
other = cached_property(other_value)
|
||||||
other2 = cached_property(other_value, name='different_name')
|
|
||||||
|
|
||||||
attrs = ['_Class__value', 'other']
|
attrs = ['_Class__value', 'other']
|
||||||
for attr in attrs:
|
for attr in attrs:
|
||||||
self.assertCachedPropertyWorks(attr, Class)
|
self.assertCachedPropertyWorks(attr, Class)
|
||||||
|
|
||||||
# An explicit name is ignored.
|
|
||||||
obj = Class()
|
|
||||||
obj.other2
|
|
||||||
self.assertFalse(hasattr(obj, 'different_name'))
|
|
||||||
|
|
||||||
def test_cached_property_reuse_different_names(self):
|
def test_cached_property_reuse_different_names(self):
|
||||||
"""Disallow this case because the decorated function wouldn't be cached."""
|
"""Disallow this case because the decorated function wouldn't be cached."""
|
||||||
with self.assertRaises(RuntimeError) as ctx:
|
with self.assertRaises(RuntimeError) as ctx:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user