From 70f7e3af68cb9e4878f6bc8c7da3de32c714d0a0 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Tue, 7 Feb 2023 21:39:14 +0100 Subject: [PATCH] Fix crash when an attribute node was used inside an unary op (#8209) Closes #8207 --- doc/whatsnew/fragments/8207.bugfix | 3 +++ pylint/checkers/refactoring/refactoring_checker.py | 7 +++++-- .../functional/r/regression_02/regression_8207.py | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 doc/whatsnew/fragments/8207.bugfix create mode 100644 tests/functional/r/regression_02/regression_8207.py diff --git a/doc/whatsnew/fragments/8207.bugfix b/doc/whatsnew/fragments/8207.bugfix new file mode 100644 index 0000000000..fc7001b0c6 --- /dev/null +++ b/doc/whatsnew/fragments/8207.bugfix @@ -0,0 +1,3 @@ +Fix a crash happening when a class attribute was negated in the start argument of an enumerate. + +Closes #8207 diff --git a/pylint/checkers/refactoring/refactoring_checker.py b/pylint/checkers/refactoring/refactoring_checker.py index 0d51784aec..0caa2fbb53 100644 --- a/pylint/checkers/refactoring/refactoring_checker.py +++ b/pylint/checkers/refactoring/refactoring_checker.py @@ -2338,7 +2338,11 @@ def _enumerate_with_start( return False, confidence def _get_start_value(self, node: nodes.NodeNG) -> tuple[int | None, Confidence]: - if isinstance(node, (nodes.Name, nodes.Call, nodes.Attribute)): + if ( + isinstance(node, (nodes.Name, nodes.Call, nodes.Attribute)) + or isinstance(node, nodes.UnaryOp) + and isinstance(node.operand, nodes.Attribute) + ): inferred = utils.safe_infer(node) start_val = inferred.value if inferred else None return start_val, INFERENCE @@ -2346,5 +2350,4 @@ def _get_start_value(self, node: nodes.NodeNG) -> tuple[int | None, Confidence]: return node.operand.value, HIGH if isinstance(node, nodes.Const): return node.value, HIGH - return None, HIGH diff --git a/tests/functional/r/regression_02/regression_8207.py b/tests/functional/r/regression_02/regression_8207.py new file mode 100644 index 0000000000..6538018bc1 --- /dev/null +++ b/tests/functional/r/regression_02/regression_8207.py @@ -0,0 +1,14 @@ +"""Regression test for 8207.""" + +# pylint: disable=missing-docstring,too-few-public-methods + +class Example: + def __init__(self): + self.offset = -10 + + def minus_offset(self): + return { + (x, x): value + for x, row in enumerate([(5, 10), (20, 30)]) + for y, value in enumerate(row, -self.offset) + }