Skip to content

Commit f8f05f1

Browse files
Don't emit modified-iterating-dict when updating existing keys (#7037)
Co-authored-by: Pierre Sassoulas <[email protected]>
1 parent bee24cd commit f8f05f1

File tree

4 files changed

+25
-0
lines changed

4 files changed

+25
-0
lines changed

doc/whatsnew/2/2.14/full.rst

+5
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,16 @@ Release date: TBA
1313

1414
Closes #7006
1515

16+
* Fixed a false positive for ``modified-iterating-dict`` when updating an existing key.
17+
18+
Closes #6179
19+
1620
* Fixed an issue where many-core Windows machines (>~60 logical processors) would hang when
1721
using the default jobs count.
1822

1923
Closes #6965
2024

25+
2126
What's New in Pylint 2.14.3?
2227
----------------------------
2328
Release date: 2022-06-18

pylint/checkers/modified_iterating_checker.py

+9
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,15 @@ def _modified_iterating_dict_cond(
130130
) -> bool:
131131
if not self._is_node_assigns_subscript_name(node):
132132
return False
133+
# Do not emit when merely updating the same key being iterated
134+
if (
135+
isinstance(iter_obj, nodes.Name)
136+
and iter_obj.name == node.targets[0].value.name
137+
and isinstance(iter_obj.parent.target, nodes.AssignName)
138+
and isinstance(node.targets[0].slice, nodes.Name)
139+
and iter_obj.parent.target.name == node.targets[0].slice.name
140+
):
141+
return False
133142
infer_val = utils.safe_infer(node.targets[0].value)
134143
if not isinstance(infer_val, nodes.Dict):
135144
return False

tests/functional/m/modified_iterating.py

+10
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,13 @@ def format_manifest_serializer_errors(errors):
7171
dict2 = {"2": 2}
7272
for item in dict1:
7373
dict2[item] = 1
74+
75+
76+
def update_existing_key():
77+
"""No message when updating existing keys"""
78+
for key in my_dict:
79+
my_dict[key] = 1
80+
81+
for key in my_dict:
82+
new_key = key.lower()
83+
my_dict[new_key] = 1 # [modified-iterating-dict]

tests/functional/m/modified_iterating.txt

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ modified-iterating-list:48:4:48:23::Iterated list 'item_list' is being modified
88
modified-iterating-list:52:4:52:23::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
99
modified-iterating-list:55:12:55:31::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
1010
modified-iterating-list:57:16:57:35::Iterated list 'item_list' is being modified inside for loop body, consider iterating through a copy of it instead.:INFERENCE
11+
modified-iterating-dict:83:8:83:28:update_existing_key:Iterated dict 'my_dict' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE

0 commit comments

Comments
 (0)