概要
- Python 3.11.2
- ruff 0.0.256
やりたいこと
Ruffのeradicateルールで、コメントアウトされたコードを検出したいです。
気になったこと
以下のコメント行は、コメントアウトされたコードだと検出されました。
sample.py
# タスク(保留中)
$ ruff check sample.py --select ERA
sample.py:1:1: ERA001 [*] Found commented-out code
Found 1 error.
[*] 1 potentially fixable with the --fix option.
半角括弧の後ろに何らかの文字が続けば、コメントアウトされたコーダとは認識されませんでした。
sample.py
# タスク(保留中)を削除する
$ ruff check sample.py --select ERA
コードかどうかどうやって判定しているのか
コメント行にコードが含まれているかは、以下の関数で判断しているようです。
変数CODE_INDICATORS
には半角括弧が定義されていました。
※私はRust言語を理解していません
ruff/src/rules/eradicate/detection.rs
/// Returns `true` if a comment contains Python code.
pub fn comment_contains_code(line: &str, task_tags: &[String]) -> bool {
let line = if let Some(line) = line.trim().strip_prefix('#') {
line.trim()
} else {
return false;
};
// Ignore non-comment related hashes (e.g., "# Issue #999").
if HASH_NUMBER.is_match(line) {
return false;
}
// Ignore whitelisted comments.
if ALLOWLIST_REGEX.is_match(line) {
return false;
}
if let Some(first) = line.split(&[' ', ':']).next() {
if task_tags.iter().any(|tag| tag == first) {
return false;
}
}
if CODING_COMMENT_REGEX.is_match(line) {
return false;
}
// Check that this is possibly code.
if CODE_INDICATORS.iter().all(|symbol| !line.contains(symbol)) {
return false;
}
if multiline_case(line) {
return true;
}
if CODE_KEYWORDS.iter().any(|symbol| symbol.is_match(line)) {
return true;
}
let line = PRINT_RETURN_REGEX.replace_all(line, "");
if PARTIAL_DICTIONARY_REGEX.is_match(&line) {
return true;
}
// Finally, compile the source code.
parser::parse_program(&line, "<filename>").is_ok()
}
static CODE_INDICATORS: &[&str] = &[
"(", ")", "[", "]", "{", "}", ":", "=", "%", "print", "return", "break", "continue", "import",
];
ソースを見ると、コードを含むコメント行かどうかを判定するのに、結構泥臭いことをしているようです。