Skip to content

Commit a60ddd1

Browse files
Fix incorrect suggestion for unnecessary-comprehension (#9172) (#9242)
(cherry picked from commit 6f83d5a) Co-authored-by: Sayyed Faisal Ali <[email protected]>
1 parent dc11223 commit a60ddd1

File tree

4 files changed

+36
-20
lines changed

4 files changed

+36
-20
lines changed
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
Fixed incorrect suggestion for shallow copy in unnecessary-comprehension
2+
3+
Example of the suggestion:
4+
#pylint: disable=missing-module-docstring
5+
a = [1, 2, 3]
6+
b = [x for x in a]
7+
b[0] = 0
8+
print(a) # [1, 2, 3]
9+
10+
After changing b = [x for x in a] to b = a based on the suggestion, the script now prints [0, 2, 3]. The correct suggestion should be use list(a) to preserve the original behavior.
11+
12+
Closes #9172

pylint/checkers/refactoring/refactoring_checker.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -1779,15 +1779,15 @@ def _check_unnecessary_comprehension(self, node: nodes.Comprehension) -> None:
17791779
if isinstance(node.parent, nodes.DictComp) and isinstance(
17801780
inferred, astroid.objects.DictItems
17811781
):
1782-
args = (f"{node.iter.func.expr.as_string()}",)
1783-
elif (
1784-
isinstance(node.parent, nodes.ListComp)
1785-
and isinstance(inferred, nodes.List)
1786-
) or (
1787-
isinstance(node.parent, nodes.SetComp)
1788-
and isinstance(inferred, nodes.Set)
1782+
args = (f"dict({node.iter.func.expr.as_string()})",)
1783+
elif isinstance(node.parent, nodes.ListComp) and isinstance(
1784+
inferred, nodes.List
17891785
):
1790-
args = (f"{node.iter.as_string()}",)
1786+
args = (f"list({node.iter.as_string()})",)
1787+
elif isinstance(node.parent, nodes.SetComp) and isinstance(
1788+
inferred, nodes.Set
1789+
):
1790+
args = (f"set({node.iter.as_string()})",)
17911791
if args:
17921792
self.add_message(
17931793
"unnecessary-comprehension", node=node.parent, args=args

tests/functional/u/unnecessary/unnecessary_comprehension.py

+2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
# List comprehensions
55
[x for x in iterable] # [unnecessary-comprehension]
66
[y for x in iterable] # expression != target_list
7+
[x for x in iterable] # [unnecessary-comprehension] use list(iterable)
78
[x for x,y,z in iterable] # expression != target_list
9+
[(x, y) for x, y in iterable] # [unnecessary-comprehension]
810
[(x,y,z) for x,y,z in iterable] # [unnecessary-comprehension]
911
[(x,y,z) for (x,y,z) in iterable] # [unnecessary-comprehension]
1012
[x for x, *y in iterable] # expression != target_list
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
unnecessary-comprehension:5:0:5:21::Unnecessary use of a comprehension, use list(iterable) instead.:UNDEFINED
2-
unnecessary-comprehension:8:0:8:31::Unnecessary use of a comprehension, use list(iterable) instead.:UNDEFINED
3-
unnecessary-comprehension:9:0:9:33::Unnecessary use of a comprehension, use list(iterable) instead.:UNDEFINED
4-
unnecessary-comprehension:17:7:17:42::Unnecessary use of a comprehension, use list(a_dict.items()) instead.:UNDEFINED
5-
unnecessary-comprehension:20:0:20:21::Unnecessary use of a comprehension, use set(iterable) instead.:UNDEFINED
6-
unnecessary-comprehension:23:0:23:31::Unnecessary use of a comprehension, use set(iterable) instead.:UNDEFINED
7-
unnecessary-comprehension:24:7:24:42::Unnecessary use of a comprehension, use set(iterable) instead.:UNDEFINED
8-
unnecessary-comprehension:32:0:32:27::Unnecessary use of a comprehension, use dict(iterable) instead.:UNDEFINED
9-
unnecessary-comprehension:34:0:34:29::Unnecessary use of a comprehension, use dict(iterable) instead.:UNDEFINED
10-
unnecessary-comprehension:46:0:46:26::Unnecessary use of a comprehension, use my_list instead.:UNDEFINED
11-
unnecessary-comprehension:47:8:47:42::Unnecessary use of a comprehension, use my_dict instead.:UNDEFINED
12-
consider-using-dict-items:48:0:None:None::Consider iterating with .items():UNDEFINED
13-
unnecessary-comprehension:49:0:49:25::Unnecessary use of a comprehension, use my_set instead.:UNDEFINED
2+
unnecessary-comprehension:7:0:7:21::Unnecessary use of a comprehension, use list(iterable) instead.:UNDEFINED
3+
unnecessary-comprehension:9:0:9:29::Unnecessary use of a comprehension, use list(iterable) instead.:UNDEFINED
4+
unnecessary-comprehension:10:0:10:31::Unnecessary use of a comprehension, use list(iterable) instead.:UNDEFINED
5+
unnecessary-comprehension:11:0:11:33::Unnecessary use of a comprehension, use list(iterable) instead.:UNDEFINED
6+
unnecessary-comprehension:19:7:19:42::Unnecessary use of a comprehension, use list(a_dict.items()) instead.:UNDEFINED
7+
unnecessary-comprehension:22:0:22:21::Unnecessary use of a comprehension, use set(iterable) instead.:UNDEFINED
8+
unnecessary-comprehension:25:0:25:31::Unnecessary use of a comprehension, use set(iterable) instead.:UNDEFINED
9+
unnecessary-comprehension:26:7:26:42::Unnecessary use of a comprehension, use set(iterable) instead.:UNDEFINED
10+
unnecessary-comprehension:34:0:34:27::Unnecessary use of a comprehension, use dict(iterable) instead.:UNDEFINED
11+
unnecessary-comprehension:36:0:36:29::Unnecessary use of a comprehension, use dict(iterable) instead.:UNDEFINED
12+
unnecessary-comprehension:48:0:48:26::Unnecessary use of a comprehension, use list(my_list) instead.:UNDEFINED
13+
unnecessary-comprehension:49:8:49:42::Unnecessary use of a comprehension, use dict(my_dict) instead.:UNDEFINED
14+
consider-using-dict-items:50:0:None:None::Consider iterating with .items():UNDEFINED
15+
unnecessary-comprehension:51:0:51:25::Unnecessary use of a comprehension, use set(my_set) instead.:UNDEFINED

0 commit comments

Comments
 (0)