astral-sh / ruff

An extremely fast Python linter and code formatter, written in Rust.

Home Page:https://docs.astral.sh/ruff

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Rule duplication `F509` and `PLE1300`

dhruvmanila opened this issue · comments

Both rules check for invalid format character in % format style string.

The implementation is almost the same:

F509

match pyflakes::cformat::CFormatSummary::try_from(value.to_str()) {
Err(CFormatError {
typ: CFormatErrorType::UnsupportedFormatChar(c),
..
}) => {
if checker.enabled(Rule::PercentFormatUnsupportedFormatCharacter) {
checker.diagnostics.push(Diagnostic::new(
pyflakes::rules::PercentFormatUnsupportedFormatCharacter {
char: c,
},
location,
));
}
}

PLE1300

// Parse the format string (e.g. `"%s"`) into a list of `PercentFormat`.
if let Err(format_error) = CFormatString::from_str(string) {
if let CFormatErrorType::UnsupportedFormatChar(format_char) = format_error.typ {
checker.diagnostics.push(Diagnostic::new(
BadStringFormatCharacter { format_char },
expr.range(),
));
}
};

There's one difference which can be noticed when an implicitly concatenated string is used. F509 looks at the concatenated string while PLE1300 looks at each part of an implicitly concatenated string. Refer to https://play.ruff.rs/6efd9945-2a3b-43e4-b9b7-a8d041b98318.

Reference:

@dhruvmanila - Let's remove PLE1300 as part of v0.5.0?

See #9756 for prior art.

Let's remove PLE1300 as part of v0.5.0?

Yeah, that makes sense but there's one difference where PLE1300 would check each part of an implicitly concatenated string while F509 checks it as a whole. This means that the number of diagnostics would be reduced. That said, I think F509 can be improved to either

  1. Include all the invalid characters in the message or
  2. Raise violation for each invalid character and highlighting the part of the string instead of the entire string