From 3d19cd0fdfe44cef9380cc92025f8965e0e953b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 5 Apr 2022 16:52:05 +0200 Subject: [PATCH 1/5] Make ``cache-max-size-none`` check ``functools.cache`` --- ChangeLog | 4 ++ .../messages/c/cache-max-size-none/bad.py | 9 ++++ .../messages/c/cache-max-size-none/good.py | 13 +++++ doc/whatsnew/2.14.rst | 4 ++ pylint/checkers/stdlib.py | 22 +++++---- tests/functional/c/cache_max_size_none.txt | 14 +++--- .../functional/c/cache_max_size_none_py39.py | 47 +++++++++++++++++++ .../functional/c/cache_max_size_none_py39.rc | 2 + .../functional/c/cache_max_size_none_py39.txt | 5 ++ 9 files changed, 104 insertions(+), 16 deletions(-) create mode 100644 doc/data/messages/c/cache-max-size-none/bad.py create mode 100644 doc/data/messages/c/cache-max-size-none/good.py create mode 100644 tests/functional/c/cache_max_size_none_py39.py create mode 100644 tests/functional/c/cache_max_size_none_py39.rc create mode 100644 tests/functional/c/cache_max_size_none_py39.txt diff --git a/ChangeLog b/ChangeLog index a8dae77624..009ea0dac1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -40,6 +40,10 @@ Release date: TBA Closes #5936 +* * Added ``cache-max-size-none`` checker will now also check ``functools.cache``. + + Closes #5670 + * ``potential-index-error``: Emitted when the index of a list or tuple exceeds its length. This checker is currently quite conservative to avoid false positives. We welcome suggestions for improvements. diff --git a/doc/data/messages/c/cache-max-size-none/bad.py b/doc/data/messages/c/cache-max-size-none/bad.py new file mode 100644 index 0000000000..f1f0c340c3 --- /dev/null +++ b/doc/data/messages/c/cache-max-size-none/bad.py @@ -0,0 +1,9 @@ +import functools + + +class Fibonnaci: + @functools.cache # [cache-max-size-none] + def fibonacci(self, n): + if n in {0, 1}: + return n + return self.fibonacci(n - 1) + self.fibonacci(n - 2) diff --git a/doc/data/messages/c/cache-max-size-none/good.py b/doc/data/messages/c/cache-max-size-none/good.py new file mode 100644 index 0000000000..6f3ca256ae --- /dev/null +++ b/doc/data/messages/c/cache-max-size-none/good.py @@ -0,0 +1,13 @@ +import functools + + +@functools.cache +def cached_fibonacci(n): + if n in {0, 1}: + return n + return cached_fibonacci(n - 1) + cached_fibonacci(n - 2) + + +class Fibonnaci: + def fibonacci(self, n): + return cached_fibonacci(n) diff --git a/doc/whatsnew/2.14.rst b/doc/whatsnew/2.14.rst index 82a9e7e1a0..c9c9680faf 100644 --- a/doc/whatsnew/2.14.rst +++ b/doc/whatsnew/2.14.rst @@ -71,6 +71,10 @@ Other Changes * The concept of checker priority has been removed. +* Added ``cache-max-size-none`` checker will now also check ``functools.cache``. + + Closes #5670 + * The ``set_config_directly`` decorator has been removed. * The ``ignore-mixin-members`` option has been deprecated. You should now use the new diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py index 6eeaa20a90..2b5484f438 100644 --- a/pylint/checkers/stdlib.py +++ b/pylint/checkers/stdlib.py @@ -429,10 +429,10 @@ class StdlibChecker(DeprecatedMixin, BaseChecker): "from code that is not actively being debugged.", ), "W1517": ( - "'lru_cache(maxsize=None)' will keep all method args alive indefinitely, including 'self'", + "'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self'", "cache-max-size-none", - "By decorating a method with lru_cache the 'self' argument will be linked to " - "the lru_cache function and therefore never garbage collected. Unless your instance " + "By decorating a method with lru_cache or cache the 'self' argument will be linked to " + "the function and therefore never garbage collected. Unless your instance " "will never need to be garbage collected (singleton) it is recommended to refactor " "code to avoid this pattern or add a maxsize to the cache." "The default value for maxsize is 128.", @@ -575,23 +575,27 @@ def _check_lru_cache_decorators(self, decorators: nodes.Decorators) -> None: try: for infered_node in d_node.infer(): q_name = infered_node.qname() - if q_name in NON_INSTANCE_METHODS or q_name not in LRU_CACHE: + if q_name in NON_INSTANCE_METHODS: return # Check if there is a maxsize argument set to None in the call - if isinstance(d_node, nodes.Call): + if q_name in LRU_CACHE and isinstance(d_node, nodes.Call): try: arg = utils.get_argument_from_call( d_node, position=0, keyword="maxsize" ) except utils.NoSuchArgumentError: - return + break if not isinstance(arg, nodes.Const) or arg.value is not None: - return + break - lru_cache_nodes.append(d_node) - break + lru_cache_nodes.append(d_node) + break + + if q_name == "functools.cache": + lru_cache_nodes.append(d_node) + break except astroid.InferenceError: pass for lru_cache_node in lru_cache_nodes: diff --git a/tests/functional/c/cache_max_size_none.txt b/tests/functional/c/cache_max_size_none.txt index 6fb063df5b..614d523ad7 100644 --- a/tests/functional/c/cache_max_size_none.txt +++ b/tests/functional/c/cache_max_size_none.txt @@ -1,7 +1,7 @@ -cache-max-size-none:25:5:25:20:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:29:5:29:30:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:33:5:33:38:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:37:5:37:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:42:5:42:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:43:5:43:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:73:5:73:40:MyClassWithMethodsAndMaxSize.my_func:'lru_cache(maxsize=None)' will keep all method args alive indefinitely, including 'self':INFERENCE +cache-max-size-none:25:5:25:20:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +cache-max-size-none:29:5:29:30:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +cache-max-size-none:33:5:33:38:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +cache-max-size-none:37:5:37:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +cache-max-size-none:42:5:42:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +cache-max-size-none:43:5:43:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +cache-max-size-none:73:5:73:40:MyClassWithMethodsAndMaxSize.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE diff --git a/tests/functional/c/cache_max_size_none_py39.py b/tests/functional/c/cache_max_size_none_py39.py new file mode 100644 index 0000000000..a86dc7424f --- /dev/null +++ b/tests/functional/c/cache_max_size_none_py39.py @@ -0,0 +1,47 @@ +"""Tests for cache-max-size-none""" +# pylint: disable=no-self-use, missing-function-docstring, reimported, too-few-public-methods +# pylint: disable=missing-class-docstring, function-redefined + +import functools +import functools as aliased_functools +from functools import cache +from functools import cache as aliased_cache + + +@cache +def my_func(param): + return param + 1 + + +class MyClassWithMethods: + @cache + @staticmethod + def my_func(param): + return param + 1 + + @cache + @classmethod + def my_func(cls, param): + return param + 1 + + @cache # [cache-max-size-none] + def my_func(self, param): + return param + 1 + + @functools.cache # [cache-max-size-none] + def my_func(self, param): + return param + 1 + + @aliased_functools.cache # [cache-max-size-none] + def my_func(self, param): + return param + 1 + + @aliased_cache # [cache-max-size-none] + def my_func(self, param): + return param + 1 + + # Check double decorating to check robustness of checker itself + @functools.lru_cache(maxsize=1) + @aliased_cache # [cache-max-size-none] + def my_func(self, param): + return param + 1 diff --git a/tests/functional/c/cache_max_size_none_py39.rc b/tests/functional/c/cache_max_size_none_py39.rc new file mode 100644 index 0000000000..15ad50f5ab --- /dev/null +++ b/tests/functional/c/cache_max_size_none_py39.rc @@ -0,0 +1,2 @@ +[testoptions] +min_pyver = 3.9 diff --git a/tests/functional/c/cache_max_size_none_py39.txt b/tests/functional/c/cache_max_size_none_py39.txt new file mode 100644 index 0000000000..ed84fa5895 --- /dev/null +++ b/tests/functional/c/cache_max_size_none_py39.txt @@ -0,0 +1,5 @@ +cache-max-size-none:27:5:27:10:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +cache-max-size-none:31:5:31:20:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +cache-max-size-none:35:5:35:28:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +cache-max-size-none:39:5:39:18:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +cache-max-size-none:45:5:45:18:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE From f6031ac92305beaf44e243a760084d869d249525 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Tue, 5 Apr 2022 22:12:45 +0200 Subject: [PATCH 2/5] Test case for lru_cache with maxsize=None in a function --- tests/functional/c/cache_max_size_none.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/functional/c/cache_max_size_none.py b/tests/functional/c/cache_max_size_none.py index e4c157ddb0..df7edc3a0c 100644 --- a/tests/functional/c/cache_max_size_none.py +++ b/tests/functional/c/cache_max_size_none.py @@ -73,3 +73,7 @@ def my_func(self, param): @lru_cache(typed=True, maxsize=None) # [cache-max-size-none] def my_func(self, param): return param + 1 + +@lru_cache(maxsize=None) +def my_func(param): + return param + 1 From fa18cb9bcb682a5d405780f469c89329a00b1fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 12 Apr 2022 21:13:29 +0200 Subject: [PATCH 3/5] Apply suggestions from code review Co-authored-by: Pierre Sassoulas --- ChangeLog | 2 +- doc/whatsnew/2.14.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index f1445ced63..7d3fb88ef2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -74,7 +74,7 @@ Release date: TBA Closes #5936 -* * Added ``cache-max-size-none`` checker will now also check ``functools.cache``. +* The ``cache-max-size-none`` checker will now also check ``functools.cache``. Closes #5670 diff --git a/doc/whatsnew/2.14.rst b/doc/whatsnew/2.14.rst index 761374ae87..cb7a309c04 100644 --- a/doc/whatsnew/2.14.rst +++ b/doc/whatsnew/2.14.rst @@ -100,7 +100,7 @@ Other Changes * The concept of checker priority has been removed. -* Added ``cache-max-size-none`` checker will now also check ``functools.cache``. +* The ``cache-max-size-none`` checker will now also check ``functools.cache``. Closes #5670 From a75e49d10e43edc972b047560b3e53a46526c8a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 12 Apr 2022 21:21:27 +0200 Subject: [PATCH 4/5] Fix? --- doc/data/messages/c/cache-max-size-none/bad.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/data/messages/c/cache-max-size-none/bad.py b/doc/data/messages/c/cache-max-size-none/bad.py index f1f0c340c3..2830f334cc 100644 --- a/doc/data/messages/c/cache-max-size-none/bad.py +++ b/doc/data/messages/c/cache-max-size-none/bad.py @@ -2,7 +2,7 @@ class Fibonnaci: - @functools.cache # [cache-max-size-none] + @functools.lru_cache(maxsize=None) # [cache-max-size-none] def fibonacci(self, n): if n in {0, 1}: return n From f628ea83e7d385180b88bfef41968c6661b487de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 19 Apr 2022 08:23:31 +0200 Subject: [PATCH 5/5] Rename --- ChangeLog | 6 +++++- .../method-cache-max-size-none}/bad.py | 2 +- .../method-cache-max-size-none}/good.py | 0 doc/whatsnew/2.14.rst | 6 +++++- pylint/checkers/stdlib.py | 15 ++++++++++----- pylint/message/message_definition_store.py | 2 +- tests/functional/c/cache_max_size_none.txt | 7 ------- tests/functional/c/cache_max_size_none_py39.txt | 5 ----- .../method_cache_max_size_none.py} | 17 +++++++++-------- .../functional/m/method_cache_max_size_none.txt | 7 +++++++ .../method_cache_max_size_none_py39.py} | 12 ++++++------ .../method_cache_max_size_none_py39.rc} | 0 .../m/method_cache_max_size_none_py39.txt | 5 +++++ 13 files changed, 49 insertions(+), 35 deletions(-) rename doc/data/messages/{c/cache-max-size-none => m/method-cache-max-size-none}/bad.py (70%) rename doc/data/messages/{c/cache-max-size-none => m/method-cache-max-size-none}/good.py (100%) delete mode 100644 tests/functional/c/cache_max_size_none.txt delete mode 100644 tests/functional/c/cache_max_size_none_py39.txt rename tests/functional/{c/cache_max_size_none.py => m/method_cache_max_size_none.py} (76%) create mode 100644 tests/functional/m/method_cache_max_size_none.txt rename tests/functional/{c/cache_max_size_none_py39.py => m/method_cache_max_size_none_py39.py} (75%) rename tests/functional/{c/cache_max_size_none_py39.rc => m/method_cache_max_size_none_py39.rc} (100%) create mode 100644 tests/functional/m/method_cache_max_size_none_py39.txt diff --git a/ChangeLog b/ChangeLog index 7d3fb88ef2..af65906d9e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -74,7 +74,11 @@ Release date: TBA Closes #5936 -* The ``cache-max-size-none`` checker will now also check ``functools.cache``. +* The ``cache-max-size-none`` checker has been renamed to ``method-cache-max-size-none``. + + Closes #5670 + +* The ``method-cache-max-size-none`` checker will now also check ``functools.cache``. Closes #5670 diff --git a/doc/data/messages/c/cache-max-size-none/bad.py b/doc/data/messages/m/method-cache-max-size-none/bad.py similarity index 70% rename from doc/data/messages/c/cache-max-size-none/bad.py rename to doc/data/messages/m/method-cache-max-size-none/bad.py index 2830f334cc..7e70b688bc 100644 --- a/doc/data/messages/c/cache-max-size-none/bad.py +++ b/doc/data/messages/m/method-cache-max-size-none/bad.py @@ -2,7 +2,7 @@ class Fibonnaci: - @functools.lru_cache(maxsize=None) # [cache-max-size-none] + @functools.lru_cache(maxsize=None) # [method-cache-max-size-none] def fibonacci(self, n): if n in {0, 1}: return n diff --git a/doc/data/messages/c/cache-max-size-none/good.py b/doc/data/messages/m/method-cache-max-size-none/good.py similarity index 100% rename from doc/data/messages/c/cache-max-size-none/good.py rename to doc/data/messages/m/method-cache-max-size-none/good.py diff --git a/doc/whatsnew/2.14.rst b/doc/whatsnew/2.14.rst index cb7a309c04..350347c2a8 100644 --- a/doc/whatsnew/2.14.rst +++ b/doc/whatsnew/2.14.rst @@ -100,7 +100,11 @@ Other Changes * The concept of checker priority has been removed. -* The ``cache-max-size-none`` checker will now also check ``functools.cache``. +* The ``cache-max-size-none`` checker has been renamed to ``method-cache-max-size-none``. + + Closes #5670 + +* The ``method-cache-max-size-none`` checker will now also check ``functools.cache``. Closes #5670 diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py index 3f1fa1513f..727f2d8799 100644 --- a/pylint/checkers/stdlib.py +++ b/pylint/checkers/stdlib.py @@ -428,15 +428,20 @@ class StdlibChecker(DeprecatedMixin, BaseChecker): "Calls to breakpoint(), sys.breakpointhook() and pdb.set_trace() should be removed " "from code that is not actively being debugged.", ), - "W1517": ( + "W1518": ( "'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self'", - "cache-max-size-none", + "method-cache-max-size-none", "By decorating a method with lru_cache or cache the 'self' argument will be linked to " "the function and therefore never garbage collected. Unless your instance " "will never need to be garbage collected (singleton) it is recommended to refactor " "code to avoid this pattern or add a maxsize to the cache." "The default value for maxsize is 128.", - {"old_names": [("W1516", "lru-cache-decorating-method")]}, + { + "old_names": [ + ("W1516", "lru-cache-decorating-method"), + ("W1517", "cache-max-size-none"), + ] + }, ), } @@ -563,7 +568,7 @@ def visit_boolop(self, node: nodes.BoolOp) -> None: for value in node.values: self._check_datetime(value) - @utils.check_messages("cache-max-size-none") + @utils.check_messages("method-cache-max-size-none") def visit_functiondef(self, node: nodes.FunctionDef) -> None: if node.decorators and isinstance(node.parent, nodes.ClassDef): self._check_lru_cache_decorators(node.decorators) @@ -600,7 +605,7 @@ def _check_lru_cache_decorators(self, decorators: nodes.Decorators) -> None: pass for lru_cache_node in lru_cache_nodes: self.add_message( - "cache-max-size-none", + "method-cache-max-size-none", node=lru_cache_node, confidence=interfaces.INFERENCE, ) diff --git a/pylint/message/message_definition_store.py b/pylint/message/message_definition_store.py index 8974517bf5..eb58fd73d3 100644 --- a/pylint/message/message_definition_store.py +++ b/pylint/message/message_definition_store.py @@ -52,7 +52,7 @@ def register_message(self, message: MessageDefinition) -> None: # and the arguments are relatively small in size we do not run the # risk of creating a large memory leak. # See discussion in: https://github.com/PyCQA/pylint/pull/5673 - @functools.lru_cache(maxsize=None) # pylint: disable=cache-max-size-none + @functools.lru_cache(maxsize=None) # pylint: disable=method-cache-max-size-none def get_message_definitions(self, msgid_or_symbol: str) -> List[MessageDefinition]: """Returns the Message definition for either a numeric or symbolic id. diff --git a/tests/functional/c/cache_max_size_none.txt b/tests/functional/c/cache_max_size_none.txt deleted file mode 100644 index 614d523ad7..0000000000 --- a/tests/functional/c/cache_max_size_none.txt +++ /dev/null @@ -1,7 +0,0 @@ -cache-max-size-none:25:5:25:20:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:29:5:29:30:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:33:5:33:38:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:37:5:37:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:42:5:42:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:43:5:43:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:73:5:73:40:MyClassWithMethodsAndMaxSize.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE diff --git a/tests/functional/c/cache_max_size_none_py39.txt b/tests/functional/c/cache_max_size_none_py39.txt deleted file mode 100644 index ed84fa5895..0000000000 --- a/tests/functional/c/cache_max_size_none_py39.txt +++ /dev/null @@ -1,5 +0,0 @@ -cache-max-size-none:27:5:27:10:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:31:5:31:20:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:35:5:35:28:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:39:5:39:18:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE -cache-max-size-none:45:5:45:18:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE diff --git a/tests/functional/c/cache_max_size_none.py b/tests/functional/m/method_cache_max_size_none.py similarity index 76% rename from tests/functional/c/cache_max_size_none.py rename to tests/functional/m/method_cache_max_size_none.py index df7edc3a0c..508b3d6f2a 100644 --- a/tests/functional/c/cache_max_size_none.py +++ b/tests/functional/m/method_cache_max_size_none.py @@ -1,4 +1,4 @@ -"""Tests for cache-max-size-none""" +"""Tests for method-cache-max-size-none""" # pylint: disable=no-self-use, missing-function-docstring, reimported, too-few-public-methods # pylint: disable=missing-class-docstring, function-redefined @@ -22,25 +22,25 @@ def my_func(self, param): def my_func(self, param): return param + 1 - @lru_cache(None) # [cache-max-size-none] + @lru_cache(None) # [method-cache-max-size-none] def my_func(self, param): return param + 1 - @functools.lru_cache(None) # [cache-max-size-none] + @functools.lru_cache(None) # [method-cache-max-size-none] def my_func(self, param): return param + 1 - @aliased_functools.lru_cache(None) # [cache-max-size-none] + @aliased_functools.lru_cache(None) # [method-cache-max-size-none] def my_func(self, param): return param + 1 - @aliased_cache(None) # [cache-max-size-none] + @aliased_cache(None) # [method-cache-max-size-none] def my_func(self, param): return param + 1 # Check double decorating to check robustness of checker itself - @aliased_cache(None) # [cache-max-size-none] - @aliased_cache(None) # [cache-max-size-none] + @aliased_cache(None) # [method-cache-max-size-none] + @aliased_cache(None) # [method-cache-max-size-none] def my_func(self, param): return param + 1 @@ -70,10 +70,11 @@ def my_func(self, param): def my_func(self, param): return param + 1 - @lru_cache(typed=True, maxsize=None) # [cache-max-size-none] + @lru_cache(typed=True, maxsize=None) # [method-cache-max-size-none] def my_func(self, param): return param + 1 + @lru_cache(maxsize=None) def my_func(param): return param + 1 diff --git a/tests/functional/m/method_cache_max_size_none.txt b/tests/functional/m/method_cache_max_size_none.txt new file mode 100644 index 0000000000..6a12d97ce1 --- /dev/null +++ b/tests/functional/m/method_cache_max_size_none.txt @@ -0,0 +1,7 @@ +method-cache-max-size-none:25:5:25:20:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +method-cache-max-size-none:29:5:29:30:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +method-cache-max-size-none:33:5:33:38:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +method-cache-max-size-none:37:5:37:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +method-cache-max-size-none:42:5:42:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +method-cache-max-size-none:43:5:43:24:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +method-cache-max-size-none:73:5:73:40:MyClassWithMethodsAndMaxSize.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE diff --git a/tests/functional/c/cache_max_size_none_py39.py b/tests/functional/m/method_cache_max_size_none_py39.py similarity index 75% rename from tests/functional/c/cache_max_size_none_py39.py rename to tests/functional/m/method_cache_max_size_none_py39.py index a86dc7424f..6e499e83c8 100644 --- a/tests/functional/c/cache_max_size_none_py39.py +++ b/tests/functional/m/method_cache_max_size_none_py39.py @@ -1,4 +1,4 @@ -"""Tests for cache-max-size-none""" +"""Tests for method-cache-max-size-none""" # pylint: disable=no-self-use, missing-function-docstring, reimported, too-few-public-methods # pylint: disable=missing-class-docstring, function-redefined @@ -24,24 +24,24 @@ def my_func(param): def my_func(cls, param): return param + 1 - @cache # [cache-max-size-none] + @cache # [method-cache-max-size-none] def my_func(self, param): return param + 1 - @functools.cache # [cache-max-size-none] + @functools.cache # [method-cache-max-size-none] def my_func(self, param): return param + 1 - @aliased_functools.cache # [cache-max-size-none] + @aliased_functools.cache # [method-cache-max-size-none] def my_func(self, param): return param + 1 - @aliased_cache # [cache-max-size-none] + @aliased_cache # [method-cache-max-size-none] def my_func(self, param): return param + 1 # Check double decorating to check robustness of checker itself @functools.lru_cache(maxsize=1) - @aliased_cache # [cache-max-size-none] + @aliased_cache # [method-cache-max-size-none] def my_func(self, param): return param + 1 diff --git a/tests/functional/c/cache_max_size_none_py39.rc b/tests/functional/m/method_cache_max_size_none_py39.rc similarity index 100% rename from tests/functional/c/cache_max_size_none_py39.rc rename to tests/functional/m/method_cache_max_size_none_py39.rc diff --git a/tests/functional/m/method_cache_max_size_none_py39.txt b/tests/functional/m/method_cache_max_size_none_py39.txt new file mode 100644 index 0000000000..e364e50ef5 --- /dev/null +++ b/tests/functional/m/method_cache_max_size_none_py39.txt @@ -0,0 +1,5 @@ +method-cache-max-size-none:27:5:27:10:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +method-cache-max-size-none:31:5:31:20:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +method-cache-max-size-none:35:5:35:28:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +method-cache-max-size-none:39:5:39:18:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE +method-cache-max-size-none:45:5:45:18:MyClassWithMethods.my_func:'lru_cache(maxsize=None)' or 'cache' will keep all method args alive indefinitely, including 'self':INFERENCE