mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-30 22:01:18 +00:00
[flake8-comprehension
] Mark autofix for C420
as unsafe if there's comments inside the dict comprehension (#18768)
This commit is contained in:
parent
06da2c808f
commit
65b288b45b
3 changed files with 66 additions and 2 deletions
|
@ -90,3 +90,14 @@ def func():
|
||||||
|
|
||||||
def func():
|
def func():
|
||||||
{(a, b): a + b for (a, b) in [(1, 2), (3, 4)]} # OK
|
{(a, b): a + b for (a, b) in [(1, 2), (3, 4)]} # OK
|
||||||
|
|
||||||
|
# https://github.com/astral-sh/ruff/issues/18764
|
||||||
|
{ # 1
|
||||||
|
a # 2
|
||||||
|
: # 3
|
||||||
|
None # 4
|
||||||
|
for # 5
|
||||||
|
a # 6
|
||||||
|
in # 7
|
||||||
|
iterable # 8
|
||||||
|
} # 9
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use ast::ExprName;
|
use ast::ExprName;
|
||||||
|
use ruff_diagnostics::Applicability;
|
||||||
use ruff_macros::{ViolationMetadata, derive_message_formats};
|
use ruff_macros::{ViolationMetadata, derive_message_formats};
|
||||||
use ruff_python_ast::comparable::ComparableExpr;
|
use ruff_python_ast::comparable::ComparableExpr;
|
||||||
use ruff_python_ast::helpers::any_over_expr;
|
use ruff_python_ast::helpers::any_over_expr;
|
||||||
|
@ -31,6 +32,19 @@ use crate::{Edit, Fix, FixAvailability, Violation};
|
||||||
/// dict.fromkeys(iterable, 1)
|
/// dict.fromkeys(iterable, 1)
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
|
/// ## Fix safety
|
||||||
|
/// This rule's fix is marked as unsafe if there's comments inside the dict comprehension,
|
||||||
|
/// as comments may be removed.
|
||||||
|
///
|
||||||
|
/// For example, the fix would be marked as unsafe in the following case:
|
||||||
|
/// ```python
|
||||||
|
/// { # comment 1
|
||||||
|
/// a: # comment 2
|
||||||
|
/// None # comment 3
|
||||||
|
/// for a in iterable # comment 4
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
/// ## References
|
/// ## References
|
||||||
/// - [Python documentation: `dict.fromkeys`](https://docs.python.org/3/library/stdtypes.html#dict.fromkeys)
|
/// - [Python documentation: `dict.fromkeys`](https://docs.python.org/3/library/stdtypes.html#dict.fromkeys)
|
||||||
#[derive(ViolationMetadata)]
|
#[derive(ViolationMetadata)]
|
||||||
|
@ -121,7 +135,7 @@ pub(crate) fn unnecessary_dict_comprehension_for_iterable(
|
||||||
);
|
);
|
||||||
|
|
||||||
if checker.semantic().has_builtin_binding("dict") {
|
if checker.semantic().has_builtin_binding("dict") {
|
||||||
diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement(
|
let edit = Edit::range_replacement(
|
||||||
checker
|
checker
|
||||||
.generator()
|
.generator()
|
||||||
.expr(&fix_unnecessary_dict_comprehension(
|
.expr(&fix_unnecessary_dict_comprehension(
|
||||||
|
@ -129,7 +143,15 @@ pub(crate) fn unnecessary_dict_comprehension_for_iterable(
|
||||||
generator,
|
generator,
|
||||||
)),
|
)),
|
||||||
dict_comp.range(),
|
dict_comp.range(),
|
||||||
)));
|
);
|
||||||
|
diagnostic.set_fix(Fix::applicable_edit(
|
||||||
|
edit,
|
||||||
|
if checker.comment_ranges().intersects(dict_comp.range()) {
|
||||||
|
Applicability::Unsafe
|
||||||
|
} else {
|
||||||
|
Applicability::Safe
|
||||||
|
},
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -202,3 +202,34 @@ C420.py:59:6: C420 [*] Unnecessary dict comprehension for iterable; use `dict.fr
|
||||||
60 60 |
|
60 60 |
|
||||||
61 61 |
|
61 61 |
|
||||||
62 62 | # Non-violation cases: RUF025
|
62 62 | # Non-violation cases: RUF025
|
||||||
|
|
||||||
|
C420.py:95:1: C420 [*] Unnecessary dict comprehension for iterable; use `dict.fromkeys` instead
|
||||||
|
|
|
||||||
|
94 | # https://github.com/astral-sh/ruff/issues/18764
|
||||||
|
95 | / { # 1
|
||||||
|
96 | | a # 2
|
||||||
|
97 | | : # 3
|
||||||
|
98 | | None # 4
|
||||||
|
99 | | for # 5
|
||||||
|
100 | | a # 6
|
||||||
|
101 | | in # 7
|
||||||
|
102 | | iterable # 8
|
||||||
|
103 | | } # 9
|
||||||
|
| |_^ C420
|
||||||
|
|
|
||||||
|
= help: Replace with `dict.fromkeys(iterable, value)`)
|
||||||
|
|
||||||
|
ℹ Unsafe fix
|
||||||
|
92 92 | {(a, b): a + b for (a, b) in [(1, 2), (3, 4)]} # OK
|
||||||
|
93 93 |
|
||||||
|
94 94 | # https://github.com/astral-sh/ruff/issues/18764
|
||||||
|
95 |-{ # 1
|
||||||
|
96 |-a # 2
|
||||||
|
97 |-: # 3
|
||||||
|
98 |-None # 4
|
||||||
|
99 |-for # 5
|
||||||
|
100 |-a # 6
|
||||||
|
101 |-in # 7
|
||||||
|
102 |-iterable # 8
|
||||||
|
103 |-} # 9
|
||||||
|
95 |+dict.fromkeys(iterable) # 9
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue