python / python/mypy

Incompatible return value type when using typevar with bound and self returning method

Abierto
#17,155 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug
Lenguaje dominante
Python
Estrellas
20.6k
Forks
3.3k
Merge medio
1 d 18 h
PR fusionados (30 d)
54

Descripción

Bug Report

Using a typevar bound to a class that has a self returning method leads to an error when using in a function that operates on the typevar and returns the typevar.
Using constraint does not present the issue but looses the generic on the class.

To Reproduce

# pyright: strict
from typing import Any, Generic, TypeVar
from typing_extensions import Self, reveal_type

T = TypeVar("T")


class X(Generic[T]):
    def m(self, v: int) -> Self:
        return self

class Y:
    def m(self, v: int) -> Self:
        return self

# using bound: tb_self errors with Incompatible return value type
TB = TypeVar("TB", bound=X[Any] | Y)

def tb_self(value: TB) -> TB:
    return value.m(42)

def tb(value: TB) -> TB:
    return value

reveal_type(tb_self(X[int]()))
reveal_type(tb(X[int]()))

# using constraint: return type is X[Any] in both cases
TC = TypeVar("TC", X[Any], Y)

def tc_self(value: TC) -> TC:
    return value.m(42)

def tc(value: TC) -> TC:
    return value

reveal_type(tc_self(X[int]()))
reveal_type(tc(X[int]()))

https://gist.github.com/mypy-play/3f911f7de9e2282fb6463a7146ffae47

The output is:

file.py:20:12: error: Incompatible return value type (got "X[Any] | Y", expected "TB")  [return-value]
file.py:25:13: note: Revealed type is "try_.X[builtins.int]"
file.py:26:13: note: Revealed type is "try_.X[builtins.int]"
file.py:37:13: note: Revealed type is "try_.X[Any]"
file.py:38:13: note: Revealed type is "try_.X[Any]"
Found 1 error in 1 file (checked 1 source file)

For reference pyright on the same input reports no error

Expected Behavior

The is no error.

Actual Behavior

Mypy reports an error when the using a self returning method

Your Environment

  • Mypy version used: 1.9.0, 1.7.1
  • Mypy command-line flags: none
  • Mypy configuration options from mypy.ini (and other config files): -
  • Python version used: 3.10, 3.12

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 reproduciendo el ejemplo proporcionado con mypy 1.9.0 y las versiones de Python indicadas; después, compara los casos de TypeVar ligado y restringido, así como sus tipos revelados. Se considera terminado cuando el método que devuelve self no produce ningún diagnóstico de retorno incompatible y conserva el tipo genérico mostrado en la salida reveal esperada.

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

Evaluación

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

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.