From 8f50421c25f996bf79f9d64ab1272dbb84142220 Mon Sep 17 00:00:00 2001 From: Tim Martin Date: Fri, 25 Mar 2022 20:21:34 +0000 Subject: [PATCH 1/4] Suppress ``useless-super-delegation`` if return type changed (#5822) --- pylint/checkers/classes/class_checker.py | 8 +++++ .../useless/useless_super_delegation_py35.py | 34 +++++++++++++++++++ .../useless/useless_super_delegation_py35.txt | 1 + 3 files changed, 43 insertions(+) diff --git a/pylint/checkers/classes/class_checker.py b/pylint/checkers/classes/class_checker.py index bb3f3d169d..eb786d0f8d 100644 --- a/pylint/checkers/classes/class_checker.py +++ b/pylint/checkers/classes/class_checker.py @@ -1298,6 +1298,14 @@ def form_annotations(arguments): if called_annotations != overridden_annotations: return + if ( + function.returns is not None and + meth_node.returns is None + or meth_node.returns.as_string() != function.returns.as_string() + ): + # Override adds typing information to the return type + return + if _definition_equivalent_to_call(params, args): self.add_message( "useless-super-delegation", node=function, args=(function.name,) diff --git a/tests/functional/u/useless/useless_super_delegation_py35.py b/tests/functional/u/useless/useless_super_delegation_py35.py index 16030f8a4d..93a77f5011 100644 --- a/tests/functional/u/useless/useless_super_delegation_py35.py +++ b/tests/functional/u/useless/useless_super_delegation_py35.py @@ -10,3 +10,37 @@ class UselessSuper(object): def useless(self, first, *, second=None, **kwargs): # [useless-super-delegation] return super().useless(first, second=second, **kwargs) + +# pylint: disable=wrong-import-position +import random +from typing import Any + +class ReturnTypeAny: + choices = ['a', 1, (2, 3)] + + def draw(self) -> Any: + return random.choice(self.choices) + +class ReturnTypeNarrowed(ReturnTypeAny): + choices = [1, 2, 3] + + def draw(self) -> int: + return super().draw() + +class NoReturnType: + choices = ['a', 1, (2, 3)] + + def draw(self): + return random.choice(self.choices) + +class ReturnTypeSpecified(NoReturnType): + choices = ['a', 'b'] + + def draw(self) -> str: + return super().draw() + +class ReturnTypeSame(ReturnTypeAny): + choices = ['a', 'b'] + + def draw(self) -> Any: # [useless-super-delegation] + return super().draw() diff --git a/tests/functional/u/useless/useless_super_delegation_py35.txt b/tests/functional/u/useless/useless_super_delegation_py35.txt index abcf6c5fb4..9fcf254471 100644 --- a/tests/functional/u/useless/useless_super_delegation_py35.txt +++ b/tests/functional/u/useless/useless_super_delegation_py35.txt @@ -1 +1,2 @@ useless-super-delegation:11:4:11:15:UselessSuper.useless:Useless super delegation in method 'useless':UNDEFINED +useless-super-delegation:45:4:45:12:ReturnTypeSame.draw:Useless super delegation in method 'draw':UNDEFINED From f5c5b0c711389df0792dcf37fbc954c436056723 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 14 Apr 2022 21:00:50 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pylint/checkers/classes/class_checker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pylint/checkers/classes/class_checker.py b/pylint/checkers/classes/class_checker.py index eb786d0f8d..02b8ae8e73 100644 --- a/pylint/checkers/classes/class_checker.py +++ b/pylint/checkers/classes/class_checker.py @@ -1299,8 +1299,8 @@ def form_annotations(arguments): return if ( - function.returns is not None and - meth_node.returns is None + function.returns is not None + and meth_node.returns is None or meth_node.returns.as_string() != function.returns.as_string() ): # Override adds typing information to the return type From 71c01909612efb421ecaf5321b72ab773a27ed3b Mon Sep 17 00:00:00 2001 From: Tim Martin Date: Fri, 15 Apr 2022 07:26:12 +0100 Subject: [PATCH 3/4] Reinstate warning if base method has no return type annotation --- pylint/checkers/classes/class_checker.py | 6 +++--- tests/functional/u/useless/useless_super_delegation_py35.py | 2 +- .../functional/u/useless/useless_super_delegation_py35.txt | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/pylint/checkers/classes/class_checker.py b/pylint/checkers/classes/class_checker.py index 02b8ae8e73..28efd9e42d 100644 --- a/pylint/checkers/classes/class_checker.py +++ b/pylint/checkers/classes/class_checker.py @@ -1299,9 +1299,9 @@ def form_annotations(arguments): return if ( - function.returns is not None - and meth_node.returns is None - or meth_node.returns.as_string() != function.returns.as_string() + function.returns is not None and + meth_node.returns is not None and + meth_node.returns.as_string() != function.returns.as_string() ): # Override adds typing information to the return type return diff --git a/tests/functional/u/useless/useless_super_delegation_py35.py b/tests/functional/u/useless/useless_super_delegation_py35.py index 93a77f5011..789ae55d3d 100644 --- a/tests/functional/u/useless/useless_super_delegation_py35.py +++ b/tests/functional/u/useless/useless_super_delegation_py35.py @@ -36,7 +36,7 @@ def draw(self): class ReturnTypeSpecified(NoReturnType): choices = ['a', 'b'] - def draw(self) -> str: + def draw(self) -> str: # [useless-super-delegation] return super().draw() class ReturnTypeSame(ReturnTypeAny): diff --git a/tests/functional/u/useless/useless_super_delegation_py35.txt b/tests/functional/u/useless/useless_super_delegation_py35.txt index 9fcf254471..58c98b0f99 100644 --- a/tests/functional/u/useless/useless_super_delegation_py35.txt +++ b/tests/functional/u/useless/useless_super_delegation_py35.txt @@ -1,2 +1,3 @@ useless-super-delegation:11:4:11:15:UselessSuper.useless:Useless super delegation in method 'useless':UNDEFINED +useless-super-delegation:39:4:39:12:ReturnTypeSpecified.draw:Useless super delegation in method 'draw':UNDEFINED useless-super-delegation:45:4:45:12:ReturnTypeSame.draw:Useless super delegation in method 'draw':UNDEFINED From 3d76472156dba8b92f344999e83a088699a5c508 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 15 Apr 2022 06:31:47 +0000 Subject: [PATCH 4/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pylint/checkers/classes/class_checker.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pylint/checkers/classes/class_checker.py b/pylint/checkers/classes/class_checker.py index 28efd9e42d..3838b50136 100644 --- a/pylint/checkers/classes/class_checker.py +++ b/pylint/checkers/classes/class_checker.py @@ -1299,9 +1299,9 @@ def form_annotations(arguments): return if ( - function.returns is not None and - meth_node.returns is not None and - meth_node.returns.as_string() != function.returns.as_string() + function.returns is not None + and meth_node.returns is not None + and meth_node.returns.as_string() != function.returns.as_string() ): # Override adds typing information to the return type return