Property annotated as `FunctionType` triggers false unreachable error on `isinstance` check
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Merge moyen
- 1 j 18 h
- PR mergées (30 j)
- 54
Description
Bug Report
Mypy incorrectly reports an unreachable error when assert isinstance(..., FunctionType) on a @property annotated as returning FunctionType, even though the constructor enforces the invariant.
This is a false positive: no MethodType is involved, and the assertion is trivially true.
Also, the option that enables this error is warn_unreachable. Is this supposed to be a warning instead of an error?
As an aside, while asserting that a defined function (
def func(): ...) is an instance ofFunctionTypeisTrue, if a parameter of a function/method definesfunc: FunctionType, mypy will raise aarg-typeerror at the call site (error: Argument 1 to "FuncWrap" has incompatible type "Callable[[], int]"; expected "FunctionType" [arg-type]). This also seems like a false positive, as raw function definitions are implicitly of typeFunctionType. Not what this bug is about, but something I ran into designing my wrapper.
To Reproduce
from types import FunctionType
class FuncWrap:
def __init__(self, func: object) -> None:
if not isinstance(func, FunctionType):
raise TypeError()
self._func = func
@property
def __func__(self) -> FunctionType:
return self._func
def good() -> int:
return 1
wrapped = FuncWrap(good)
assert isinstance(wrapped.__func__, FunctionType)
If you replace the assert with
assert wrapped.__func__ is good, mypy reports a newcomparison-overlaperror:error: Non-overlapping identity check (left operand type: "MethodType", right operand type: "FunctionType") [comparison-overlap].
Expected Behavior
No errors/warnings.
Actual Behavior
main.py:18: error: Subclass of "MethodType" and "FunctionType" cannot exist: "MethodType" is final [unreachable]
main.py:18: error: Subclass of "MethodType" and "FunctionType" cannot exist: "FunctionType" is final [unreachable]
Found 2 errors in 1 file (checked 1 source file)
Your Environment
- Mypy version used: 2.3.1, 1.20.x, 1.10.x
- Mypy command-line flags: N/A
- Mypy configuration options from
mypy.ini(and other config files):[tool.mypy] cache_dir = "$MYPY_CONFIG_FILE_DIR/.mypy_cache" check_untyped_defs = true color_output = true disallow_any_generics = true disallow_incomplete_defs = true disallow_untyped_decorators = true disallow_untyped_defs = true exclude = [] explicit_package_bases = false files = [ "src/", "tests/" ] implicit_optional = false implicit_reexport = false incremental = true local_partial_types = true mypy_path = "$MYPY_CONFIG_FILE_DIR/src" namespace_packages = false native_parser = true num_workers = 2 plugins = [] python_version = "3.11" show_error_codes = true show_error_context = true strict = true strict_equality = true strict_optional = true warn_no_return = true warn_redundant_casts = true warn_return_any = true warn_unreachable = true warn_unused_configs = true warn_unused_ignores = true - Python version used: 3.[11-14]
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par le reproducteur dans l’issue et suivez l’analyse d’accessibilité de mypy pour l’assertion isinstance, en vous concentrant sur son traitement de FunctionType et MethodType. Ajoutez un test de régression pour le cas annoté avec property et vérifiez que warn_unreachable ne produit ni erreur ni avertissement.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- Active
- Clarté
- Plutôt claire
- Accessibilité débutants
- 50/100