changeset: 99698:a0f9a8bee85f parent: 99695:71f071f2e074 parent: 99697:33b428ef34b9 user: Serhiy Storchaka date: Mon Dec 28 23:59:09 2015 +0200 files: Misc/NEWS description: 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). diff -r 71f071f2e074 -r a0f9a8bee85f Lib/test/test_functools.py --- a/Lib/test/test_functools.py Sun Dec 27 13:17:04 2015 -0800 +++ b/Lib/test/test_functools.py Mon Dec 28 23:59:09 2015 +0200 @@ -1262,14 +1262,24 @@ def test_copy(self): 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): f_copy = copy.copy(f) self.assertIs(f_copy, f) def test_deepcopy(self): 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): f_copy = copy.deepcopy(f) self.assertIs(f_copy, f) diff -r 71f071f2e074 -r a0f9a8bee85f Misc/NEWS --- a/Misc/NEWS Sun Dec 27 13:17:04 2015 -0800 +++ b/Misc/NEWS Mon Dec 28 23:59:09 2015 +0200 @@ -123,6 +123,10 @@ 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 ints and add proper documentation and tests for the return values. diff -r 71f071f2e074 -r a0f9a8bee85f Modules/_functoolsmodule.c --- a/Modules/_functoolsmodule.c Sun Dec 27 13:17:04 2015 -0800 +++ b/Modules/_functoolsmodule.c Mon Dec 28 23:59:09 2015 +0200 @@ -1053,6 +1053,20 @@ 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 lru_cache_tp_traverse(lru_cache_object *self, visitproc visit, void *arg) { @@ -1104,6 +1118,8 @@ {"cache_info", (PyCFunction)lru_cache_cache_info, METH_NOARGS}, {"cache_clear", (PyCFunction)lru_cache_cache_clear, METH_NOARGS}, {"__reduce__", (PyCFunction)lru_cache_reduce, METH_NOARGS}, + {"__copy__", (PyCFunction)lru_cache_copy, METH_VARARGS}, + {"__deepcopy__", (PyCFunction)lru_cache_deepcopy, METH_VARARGS}, {NULL} };