Issue #25447: Copying the lru_cache() wrapper object now always works,

independedly from the type of the wrapped object (by returning the original
object unchanged).
This commit is contained in:
Serhiy Storchaka 2015-12-28 23:59:09 +02:00
commit e3a7d26aa6
3 changed files with 32 additions and 2 deletions

View File

@ -1262,14 +1262,24 @@ class TestLRU:
def test_copy(self): def test_copy(self):
cls = self.__class__ cls = self.__class__
for f in cls.cached_func[0], cls.cached_meth, cls.cached_staticmeth: def orig(x, y):
return 3 * x + y
part = self.module.partial(orig, 2)
funcs = (cls.cached_func[0], cls.cached_meth, cls.cached_staticmeth,
self.module.lru_cache(2)(part))
for f in funcs:
with self.subTest(func=f): with self.subTest(func=f):
f_copy = copy.copy(f) f_copy = copy.copy(f)
self.assertIs(f_copy, f) self.assertIs(f_copy, f)
def test_deepcopy(self): def test_deepcopy(self):
cls = self.__class__ cls = self.__class__
for f in cls.cached_func[0], cls.cached_meth, cls.cached_staticmeth: def orig(x, y):
return 3 * x + y
part = self.module.partial(orig, 2)
funcs = (cls.cached_func[0], cls.cached_meth, cls.cached_staticmeth,
self.module.lru_cache(2)(part))
for f in funcs:
with self.subTest(func=f): with self.subTest(func=f):
f_copy = copy.deepcopy(f) f_copy = copy.deepcopy(f)
self.assertIs(f_copy, f) self.assertIs(f_copy, f)

View File

@ -123,6 +123,10 @@ Core and Builtins
Library Library
------- -------
- Issue #25447: Copying the lru_cache() wrapper object now always works,
independedly from the type of the wrapped object (by returning the original
object unchanged).
- Issue #25768: Have the functions in compileall return booleans instead of - Issue #25768: Have the functions in compileall return booleans instead of
ints and add proper documentation and tests for the return values. ints and add proper documentation and tests for the return values.

View File

@ -1053,6 +1053,20 @@ lru_cache_reduce(PyObject *self, PyObject *unused)
return PyObject_GetAttrString(self, "__qualname__"); return PyObject_GetAttrString(self, "__qualname__");
} }
static PyObject *
lru_cache_copy(PyObject *self, PyObject *unused)
{
Py_INCREF(self);
return self;
}
static PyObject *
lru_cache_deepcopy(PyObject *self, PyObject *unused)
{
Py_INCREF(self);
return self;
}
static int static int
lru_cache_tp_traverse(lru_cache_object *self, visitproc visit, void *arg) lru_cache_tp_traverse(lru_cache_object *self, visitproc visit, void *arg)
{ {
@ -1104,6 +1118,8 @@ static PyMethodDef lru_cache_methods[] = {
{"cache_info", (PyCFunction)lru_cache_cache_info, METH_NOARGS}, {"cache_info", (PyCFunction)lru_cache_cache_info, METH_NOARGS},
{"cache_clear", (PyCFunction)lru_cache_cache_clear, METH_NOARGS}, {"cache_clear", (PyCFunction)lru_cache_cache_clear, METH_NOARGS},
{"__reduce__", (PyCFunction)lru_cache_reduce, METH_NOARGS}, {"__reduce__", (PyCFunction)lru_cache_reduce, METH_NOARGS},
{"__copy__", (PyCFunction)lru_cache_copy, METH_VARARGS},
{"__deepcopy__", (PyCFunction)lru_cache_deepcopy, METH_VARARGS},
{NULL} {NULL}
}; };