Generic method in generic class impacting type signature of unrelated method
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Merge medio
- 1 d 18 h
- PR fusionados (30 d)
- 54
Descripción
Bug Report
MyPy's type resolution appears to get impacted by an unrelated generic method when evaluating a method.
To Reproduce
"""Mypy bug: method-level type parameter breaks unrelated method's self type.
mypy --strict mypy-bug-repro.py
mypy 1.19.1, Python 3.13.9
"""
from typing import Protocol, Self
class Read(Protocol):
def read(self: Self) -> None: ...
class Write(Protocol):
def write(self: Self) -> None: ...
class CopyFrom(Protocol):
def copy_from(self: CopyFrom, src: CopyFrom) -> None: ...
class ReadWrite(Read, Write, Protocol):
pass
class Store[B: Read | Write | CopyFrom]:
def read(self: Store[Read]) -> None: ...
def copy_from[T: CopyFrom](self: Store[T], src: Store[T]) -> None: ...
def test(store: Store[ReadWrite]) -> None:
store.read() # Error: Invalid self argument
Expected Behavior
Expected mypy to be happy
Actual Behavior
mypy --strict --warn-unreachable --extra-checks returns;
error: Invalid self argument "Store[ReadWrite]" to attribute function "read" with type "Callable[[Store[Read]], None]" [misc]
Removing Store.copy_from fixes this.
Replacing test def with def test(store: Store[Read]) -> None: fixes this
Replacing Store.copy_from with the following fixes it as well;
type T = CopyFrom
class Store[B: Read | Write | CopyFrom]:
def read(self: Store[Read]) -> None: ...
def copy_from(self: Store[T], src: Store[T]) -> None: ...
Your Environment
- Mypy version used:
mypy 1.19.1 (compiled: yes) - Mypy command-line flags:
--strict --warn-unreachable --extra-checks - Mypy configuration options from
mypy.ini(and other config files):
[tool.mypy]
plugins = ["pydantic.mypy"]
exclude = ["build-resources"]
- Python version used:
Python 3.13.9
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza ejecutando la reproducción proporcionada de Store[ReadWrite] con mypy 1.19.1 y los flags de strictness indicados; después, sigue cómo el método genérico Store.copy_from afecta al tipo self de Store.read. Se considera terminado cuando la reproducción ya no informa de un argumento self no válido, el comportamiento genérico sigue siendo correcto y existe cobertura de regresión para este caso.
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
- Tranquilo
- Claridad
- Bastante claro
- Aptitud para principiantes
- 48/100