mypy fails to recognise dunder init method override
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Bug Report
In an inheritance scenario with pydantic.BaseModel and generics, mypy 1.2.0 fails to recognise an overridden __init__(),
and wrongly reports an error (see "actual behavior").
To Reproduce
from __future__ import annotations
from typing import Generic, List, Type, TypeVar
from pydantic import BaseModel, PrivateAttr
B_co = TypeVar("B_co", bound=BaseModel, covariant=True)
class Container(Generic[B_co], BaseModel):
"""Container is the base class for any item-type specific containers,
to allow bundling and processing of aggregates
"""
_item_class: Type[B_co] = PrivateAttr()
__root__: List[B_co]
def __init__(self, *args: B_co) -> None:
super().__init__(__root__=list(args))
def __len__(self) -> int:
return len(self.__root__)
def __getitem__(self, index: int) -> B_co:
return self.__root__[index]
class Item(BaseModel):
name: str
class Items(Container[Item]):
_item_class = Item
items = Items(Item(name="one"), Item(name="two"))
print(items)
Expected Behavior
The overridden __init__ method in the Container class has the correct signature, and mypy should not flag any issues.
Actual Behavior
ttt/ttt.py:33: error: Too many arguments for "Items" [call-arg]
ttt/ttt.py:33: error: Too many positional arguments for "Items" [misc]
ttt/ttt.py:33: error: Argument 1 to "Items" has incompatible type "Item"; expected "List[B_co]" [arg-type]
Found 3 errors in 1 file (checked 1 source file)
Your Environment
- Mypy version used: 1.2.0
- Mypy command-line flags: none
- Mypy configuration options from
mypy.ini(and other config files):
[tool.mypy]
python_version = "3.10"
strict = true
namespace_packages = false
explicit_package_bases = false
plugins = [
"pydantic.mypy"
]
follow_imports = "silent"
warn_redundant_casts = true
warn_unused_ignores = true
disallow_any_generics = true
check_untyped_defs = true
no_implicit_reexport = true
disallow_untyped_defs = true
[[tool.mypy.overrides]]
module = [
"html_text.*"
]
ignore_missing_imports = true
ignore_errors = true
[tool.pydantic-mypy]
init_forbid_extra = true
init_typed = true
warn_required_dynamic_aliases = true
warn_untyped_fields = true
- Python version used: 3.10.10
- Other versions: pydantic=1.10.7, typing-extensions=4.5.0
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
Empieza reproduciendo el ejemplo proporcionado con mypy 1.2.0 y la configuración mostrada. Sigue cómo mypy determina la firma del constructor para la subclase genérica de BaseModel y cómo la afecta el plugin de pydantic. Se considera completado cuando el ejemplo pasa la comprobación de tipos sin los tres errores indicados, conservando la tipificación prevista del constructor.
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
- 35/100