mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-03 15:15:33 +00:00
Avoid some false positives in dunder variable assigments (#4508)
This commit is contained in:
parent
d4c0a41b00
commit
2e2ba2cb16
3 changed files with 16 additions and 12 deletions
|
@ -19,7 +19,7 @@ if x > 0:
|
||||||
else:
|
else:
|
||||||
import e
|
import e
|
||||||
|
|
||||||
y = x + 1
|
__some__magic = 1
|
||||||
|
|
||||||
import f
|
import f
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ source: crates/ruff/src/rules/pycodestyle/mod.rs
|
||||||
---
|
---
|
||||||
E402.py:24:1: E402 Module level import not at top of file
|
E402.py:24:1: E402 Module level import not at top of file
|
||||||
|
|
|
|
||||||
24 | y = x + 1
|
24 | __some__magic = 1
|
||||||
25 |
|
25 |
|
||||||
26 | import f
|
26 | import f
|
||||||
| ^^^^^^^^ E402
|
| ^^^^^^^^ E402
|
||||||
|
|
|
@ -4,8 +4,6 @@ use std::path::Path;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use log::error;
|
use log::error;
|
||||||
use num_traits::Zero;
|
use num_traits::Zero;
|
||||||
use once_cell::sync::Lazy;
|
|
||||||
use regex::Regex;
|
|
||||||
use ruff_text_size::{TextRange, TextSize};
|
use ruff_text_size::{TextRange, TextSize};
|
||||||
use rustc_hash::{FxHashMap, FxHashSet};
|
use rustc_hash::{FxHashMap, FxHashSet};
|
||||||
use rustpython_parser::ast::{
|
use rustpython_parser::ast::{
|
||||||
|
@ -542,7 +540,9 @@ where
|
||||||
body.iter().any(|stmt| any_over_stmt(stmt, func))
|
body.iter().any(|stmt| any_over_stmt(stmt, func))
|
||||||
}
|
}
|
||||||
|
|
||||||
static DUNDER_REGEX: Lazy<Regex> = Lazy::new(|| Regex::new(r"__[^\s]+__").unwrap());
|
fn is_dunder(id: &str) -> bool {
|
||||||
|
id.starts_with("__") && id.ends_with("__")
|
||||||
|
}
|
||||||
|
|
||||||
/// Return `true` if the [`Stmt`] is an assignment to a dunder (like `__all__`).
|
/// Return `true` if the [`Stmt`] is an assignment to a dunder (like `__all__`).
|
||||||
pub fn is_assignment_to_a_dunder(stmt: &Stmt) -> bool {
|
pub fn is_assignment_to_a_dunder(stmt: &Stmt) -> bool {
|
||||||
|
@ -553,15 +553,19 @@ pub fn is_assignment_to_a_dunder(stmt: &Stmt) -> bool {
|
||||||
if targets.len() != 1 {
|
if targets.len() != 1 {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
match &targets[0] {
|
if let Expr::Name(ast::ExprName { id, .. }) = &targets[0] {
|
||||||
Expr::Name(ast::ExprName { id, .. }) => DUNDER_REGEX.is_match(id.as_str()),
|
is_dunder(id)
|
||||||
_ => false,
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Stmt::AnnAssign(ast::StmtAnnAssign { target, .. }) => {
|
||||||
|
if let Expr::Name(ast::ExprName { id, .. }) = target.as_ref() {
|
||||||
|
is_dunder(id)
|
||||||
|
} else {
|
||||||
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Stmt::AnnAssign(ast::StmtAnnAssign { target, .. }) => match target.as_ref() {
|
|
||||||
Expr::Name(ast::ExprName { id, .. }) => DUNDER_REGEX.is_match(id.as_str()),
|
|
||||||
_ => false,
|
|
||||||
},
|
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue