Skip to content

Commit 983d5fc

Browse files
clavedelunaDanielNoordPierre-Sassoulas
committed
Fix crash in modified_iterating checker for set defined as a class attribute (#7541)
Co-authored-by: Daniël van Noord <[email protected]> Co-authored-by: Pierre Sassoulas <[email protected]>
1 parent 5c22a79 commit 983d5fc

File tree

4 files changed

+40
-19
lines changed

4 files changed

+40
-19
lines changed

doc/whatsnew/fragments/7528.bugfix

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fixed a crash of the ``modified_iterating`` checker when iterating on a set defined as a class attribute.
2+
3+
Closes #7528

pylint/checkers/modified_iterating_checker.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,16 @@ def _is_node_expr_that_calls_attribute_name(node: nodes.NodeNG) -> bool:
113113
@staticmethod
114114
def _common_cond_list_set(
115115
node: nodes.Expr,
116-
iter_obj: nodes.NodeNG,
116+
iter_obj: nodes.Name | nodes.Attribute,
117117
infer_val: nodes.List | nodes.Set,
118118
) -> bool:
119+
iter_obj_name = (
120+
iter_obj.attrname
121+
if isinstance(iter_obj, nodes.Attribute)
122+
else iter_obj.name
123+
)
119124
return (infer_val == utils.safe_infer(iter_obj)) and (
120-
node.value.func.expr.name == iter_obj.name
125+
node.value.func.expr.name == iter_obj_name
121126
)
122127

123128
@staticmethod

tests/functional/m/modified_iterating.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
"""Tests for iterating-modified messages"""
2-
# pylint: disable=not-callable,unnecessary-comprehension,too-few-public-methods
2+
# pylint: disable=not-callable,unnecessary-comprehension,too-few-public-methods,missing-class-docstring,missing-function-docstring
33

44
import copy
5+
from enum import Enum
56

67
item_list = [1, 2, 3]
78
for item in item_list:
@@ -117,3 +118,15 @@ def my_method(self):
117118
for key in self.attribute:
118119
tmp = self.attribute.copy()
119120
tmp[key] = None
121+
122+
class MyEnum(Enum):
123+
FOO = 1
124+
BAR = 2
125+
126+
class EnumClass:
127+
ENUM_SET = {MyEnum.FOO, MyEnum.BAR}
128+
129+
def useless(self):
130+
other_set = set(self.ENUM_SET)
131+
for obj in self.ENUM_SET:
132+
other_set.remove(obj)
+16-16
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
modified-iterating-list:8:4:8:26::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
2-
modified-iterating-list:11:4:11:26::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
3-
modified-iterating-dict:29:4:29:18::Iterated dict 'my_dict' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
4-
modified-iterating-set:39:4:39:27::Iterated set 'item_set' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
5-
modified-iterating-list:46:8:46:27::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
6-
modified-iterating-set:47:8:47:26::Iterated set 'item_set' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
7-
modified-iterating-list:48:4:48:23::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
8-
modified-iterating-list:51:4:51:12::Iterated list 'list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
9-
modified-iterating-list:54:4:54:20::Iterated list 'list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
10-
modified-iterating-dict:57:4:57:9::Iterated dict 'my_dict' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
11-
modified-iterating-set:60:4:60:15::Iterated set 'item_set' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
12-
modified-iterating-list:64:4:64:23::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
13-
modified-iterating-list:67:12:67:31::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
14-
modified-iterating-list:69:16:69:35::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
15-
modified-iterating-dict:95:8:95:28:update_existing_key:Iterated dict 'my_dict' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
16-
modified-iterating-list:107:12:107:19:MyClass.my_method:Iterated list 'attribute' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
1+
modified-iterating-list:9:4:9:26::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
2+
modified-iterating-list:12:4:12:26::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
3+
modified-iterating-dict:30:4:30:18::Iterated dict 'my_dict' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
4+
modified-iterating-set:40:4:40:27::Iterated set 'item_set' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
5+
modified-iterating-list:47:8:47:27::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
6+
modified-iterating-set:48:8:48:26::Iterated set 'item_set' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
7+
modified-iterating-list:49:4:49:23::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
8+
modified-iterating-list:52:4:52:12::Iterated list 'list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
9+
modified-iterating-list:55:4:55:20::Iterated list 'list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
10+
modified-iterating-dict:58:4:58:9::Iterated dict 'my_dict' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
11+
modified-iterating-set:61:4:61:15::Iterated set 'item_set' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
12+
modified-iterating-list:65:4:65:23::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
13+
modified-iterating-list:68:12:68:31::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
14+
modified-iterating-list:70:16:70:35::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
15+
modified-iterating-dict:96:8:96:28:update_existing_key:Iterated dict 'my_dict' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE
16+
modified-iterating-list:108:12:108:19:MyClass.my_method:Iterated list 'attribute' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE

0 commit comments

Comments
 (0)