python / python/mypy

Property annotated as `FunctionType` triggers false unreachable error on `isinstance` check

Abierto
#21,879 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug topic-descriptors topic-reachability
Lenguaje dominante
Python
Estrellas
20.6k
Forks
3.3k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

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 of FunctionType is True, if a parameter of a function/method defines func: FunctionType, mypy will raise a arg-type error 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 type FunctionType. 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 new comparison-overlap error: error: Non-overlapping identity check (left operand type: "MethodType", right operand type: "FunctionType") [comparison-overlap].

gist
playground

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]

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con el reproductor del issue y sigue el análisis de alcanzabilidad de mypy para la aserción isinstance, centrándote en su tratamiento de FunctionType y MethodType. Añade una prueba de regresión para el caso anotado con property y verifica que warn_unreachable no produzca errores ni advertencias.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
compilers
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Activo
Claridad
Bastante claro
Aptitud para principiantes
50/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.