Treat return type of `singledispatch` as runtime-required (#13957)

## Summary

fixes: #13955 

## Test Plan

Update existing test case to use a return type hint for which `main`
flags `TCH003`.
This commit is contained in:
Dhruv Manilawala 2024-10-29 06:03:28 +05:30 committed by GitHub
parent 74cf66e4c2
commit ec6208e51b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 33 additions and 28 deletions

View File

@ -1,6 +1,7 @@
"""Test module.""" """Test module."""
from __future__ import annotations from __future__ import annotations
from collections.abc import Set
from functools import singledispatch from functools import singledispatch
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
@ -36,19 +37,19 @@ def _(a: DataFrame) -> DataFrame:
@singledispatch @singledispatch
def process_path(a: int | str, p: Path) -> int: def process_path(a: int | str, p: Path) -> Set:
"""Convert arg to array or leaves it as sparse matrix.""" """Convert arg to array or leaves it as sparse matrix."""
msg = f"Unhandled type {type(a)}" msg = f"Unhandled type {type(a)}"
raise NotImplementedError(msg) raise NotImplementedError(msg)
@process_path.register @process_path.register
def _(a: int, p: Path) -> int: def _(a: int, p: Path) -> Set:
return asarray(a) return asarray(a)
@process_path.register @process_path.register
def _(a: str, p: Path) -> int: def _(a: str, p: Path) -> Set:
return a return a

View File

@ -768,15 +768,19 @@ impl<'a> Visitor<'a> for Checker<'a> {
} }
} }
if let Some(expr) = returns { if let Some(expr) = returns {
match annotation { if singledispatch {
AnnotationContext::RuntimeRequired => { self.visit_runtime_required_annotation(expr);
self.visit_runtime_required_annotation(expr); } else {
} match annotation {
AnnotationContext::RuntimeEvaluated => { AnnotationContext::RuntimeRequired => {
self.visit_runtime_evaluated_annotation(expr); self.visit_runtime_required_annotation(expr);
} }
AnnotationContext::TypingOnly => { AnnotationContext::RuntimeEvaluated => {
self.visit_annotation(expr); self.visit_runtime_evaluated_annotation(expr);
}
AnnotationContext::TypingOnly => {
self.visit_annotation(expr);
}
} }
} }
} }

View File

@ -1,25 +1,25 @@
--- ---
source: crates/ruff_linter/src/rules/flake8_type_checking/mod.rs source: crates/ruff_linter/src/rules/flake8_type_checking/mod.rs
--- ---
singledispatch.py:11:20: TCH002 [*] Move third-party import `pandas.DataFrame` into a type-checking block singledispatch.py:12:20: TCH002 [*] Move third-party import `pandas.DataFrame` into a type-checking block
| |
9 | from numpy.typing import ArrayLike 10 | from numpy.typing import ArrayLike
10 | from scipy.sparse import spmatrix 11 | from scipy.sparse import spmatrix
11 | from pandas import DataFrame 12 | from pandas import DataFrame
| ^^^^^^^^^ TCH002 | ^^^^^^^^^ TCH002
12 | 13 |
13 | if TYPE_CHECKING: 14 | if TYPE_CHECKING:
| |
= help: Move into type-checking block = help: Move into type-checking block
Unsafe fix Unsafe fix
8 8 | from numpy import asarray 9 9 | from numpy import asarray
9 9 | from numpy.typing import ArrayLike 10 10 | from numpy.typing import ArrayLike
10 10 | from scipy.sparse import spmatrix 11 11 | from scipy.sparse import spmatrix
11 |-from pandas import DataFrame 12 |-from pandas import DataFrame
12 11 | 13 12 |
13 12 | if TYPE_CHECKING: 14 13 | if TYPE_CHECKING:
13 |+ from pandas import DataFrame 14 |+ from pandas import DataFrame
14 14 | from numpy import ndarray 15 15 | from numpy import ndarray
15 15 | 16 16 |
16 16 | 17 17 |