Fixes #13128
### Description
`Query.__getitem__` and `AppenderQuery.__getitem__` previously returned Union[_T, List[_T]] for all inputs, making the return type inaccurate.
Added `@overload` signatures so that integer index returns _T and slice returns List[_T].
This pull request is:
- [x] A documentation / typographical / small typing error fix
- Good to go, no issue or tests are needed
Closes: #13142
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/13142
Pull-request-sha:
9ba1f0145d90b18c997137aeba7fde72dac23a7c
Change-Id: Ib37ab63d3d844491c34cc5ccfc4efc1591a1878c
from typing import Iterator
from typing import List
from typing import Optional
+from typing import overload
from typing import Tuple
from typing import Type
from typing import TYPE_CHECKING
def __iter__(self) -> Iterator[_T]: ...
- def __getitem__(self, index: Any) -> Union[_T, List[_T]]:
+ @overload
+ def __getitem__(self, index: int) -> _T: ...
+
+ @overload
+ def __getitem__(self, index: slice) -> List[_T]: ...
+
+ def __getitem__(self, index: Union[int, slice]) -> Union[_T, List[_T]]:
sess = self.session
if sess is None:
return self.attr._get_collection_history(
PassiveFlag.PASSIVE_NO_INITIALIZE,
).indexed(index)
else:
- return self._generate(sess).__getitem__(index) # type: ignore[no-any-return] # noqa: E501
+ return self._generate(sess).__getitem__(index)
def count(self) -> int:
sess = self.session
from typing import Optional
from typing import overload
from typing import Sequence
+from typing import SupportsIndex
from typing import Tuple
from typing import Type
from typing import TYPE_CHECKING
self._set_select_from(from_obj, False)
return self
+ @overload
+ def __getitem__(self, item: slice) -> List[_T]: ...
+
+ @overload
+ def __getitem__(self, item: SupportsIndex) -> _T: ...
+
def __getitem__(self, item: Any) -> Any:
return orm_util._getitem(
self,
# test #9985
stmt = select(User).join(User.addresses)
+
+ # test #13128
+ if typing.TYPE_CHECKING:
+ assert_type(u.addresses[0], Address)
+ assert_type(u.addresses[1:3], list[Address])
def test_select_from() -> None:
select(1).select_from(User).exists()
exists(1).select_from(User).select()
+
+
+def t_legacy_query_getitem() -> None:
+ q1 = session.query(User).filter(User.id == 5)
+ assert_type(q1[0], User)
+ assert_type(q1[1:3], list[User])