summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Walls <jacobtylerwalls@gmail.com>2023-05-12 14:56:14 -0400
committerGitHub <noreply@github.com>2023-05-12 14:56:14 -0400
commitaed3c080388a8dc1d44c1a14a5ed243233f77c1c (patch)
tree039ef72282d4738de1f8f875d5faf64ecbf1674d
parent0d878ddb13b269a47ac336d6629632eacf143164 (diff)
downloadpylint-git-aed3c080388a8dc1d44c1a14a5ed243233f77c1c.tar.gz
Fix crash when deleting from a dict returned from a call (#8678)
-rw-r--r--doc/whatsnew/fragments/8598.bugfix4
-rw-r--r--pylint/checkers/modified_iterating_checker.py6
-rw-r--r--tests/functional/m/modified_iterating.py7
-rw-r--r--tests/functional/m/modified_iterating.txt1
4 files changed, 13 insertions, 5 deletions
diff --git a/doc/whatsnew/fragments/8598.bugfix b/doc/whatsnew/fragments/8598.bugfix
new file mode 100644
index 000000000..e1961f709
--- /dev/null
+++ b/doc/whatsnew/fragments/8598.bugfix
@@ -0,0 +1,4 @@
+Fix crash for ``modified-while-iterating`` checker when deleting
+members of a dict returned from a call.
+
+Closes #8598
diff --git a/pylint/checkers/modified_iterating_checker.py b/pylint/checkers/modified_iterating_checker.py
index 9d89f7255..61471b9ee 100644
--- a/pylint/checkers/modified_iterating_checker.py
+++ b/pylint/checkers/modified_iterating_checker.py
@@ -90,14 +90,10 @@ class ModifiedIterationChecker(checkers.BaseChecker):
elif self._modified_iterating_set_cond(node, iter_obj):
msg_id = "modified-iterating-set"
if msg_id:
- if isinstance(iter_obj, nodes.Attribute):
- obj_name = iter_obj.attrname
- else:
- obj_name = iter_obj.name
self.add_message(
msg_id,
node=node,
- args=(obj_name,),
+ args=(iter_obj._repr_name(),),
confidence=interfaces.INFERENCE,
)
diff --git a/tests/functional/m/modified_iterating.py b/tests/functional/m/modified_iterating.py
index 2dae6c106..bd2d0dd13 100644
--- a/tests/functional/m/modified_iterating.py
+++ b/tests/functional/m/modified_iterating.py
@@ -119,6 +119,13 @@ class MyClass2:
tmp = self.attribute.copy()
tmp[key] = None
+
+def my_call():
+ """Regression test for https://github.com/pylint-dev/pylint/issues/7461"""
+ for var in {}.copy():
+ del var # [modified-iterating-dict]
+
+
class MyEnum(Enum):
FOO = 1
BAR = 2
diff --git a/tests/functional/m/modified_iterating.txt b/tests/functional/m/modified_iterating.txt
index e5b57ca32..66544da38 100644
--- a/tests/functional/m/modified_iterating.txt
+++ b/tests/functional/m/modified_iterating.txt
@@ -14,3 +14,4 @@ modified-iterating-list:68:12:68:31::Iterated list 'item_list' is being modified
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
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
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
+modified-iterating-dict:126:8:126:15:my_call:Iterated dict '' is being modified inside for loop body, iterate through a copy of it instead.:INFERENCE