Open
Description
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