Skip to content

Commit 045732a

Browse files
committed
fully type functions.py
Completed pep-484 typing for the ``sqlalchemy.sql.functions`` module. :func:`_sql.select` constructs made against ``func`` elements should now have filled-in return types. References: #6810 Change-Id: I5121583c9c5b6f7151f811348c7a281c446cf0b8
1 parent 7bc33ca commit 045732a

8 files changed

Lines changed: 451 additions & 134 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.. change::
2+
:tags: bug, typing
3+
:tickets: 6810
4+
5+
Completed pep-484 typing for the ``sqlalchemy.sql.functions`` module.
6+
:func:`_sql.select` constructs made against ``func`` elements should now
7+
have filled-in return types.

lib/sqlalchemy/sql/_elements_constructors.py

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import typing
1111
from typing import Any
1212
from typing import Callable
13-
from typing import Iterable
1413
from typing import Mapping
1514
from typing import Optional
1615
from typing import overload
@@ -49,6 +48,7 @@
4948
from ..util.typing import Literal
5049

5150
if typing.TYPE_CHECKING:
51+
from ._typing import _ByArgument
5252
from ._typing import _ColumnExpressionArgument
5353
from ._typing import _ColumnExpressionOrLiteralArgument
5454
from ._typing import _ColumnExpressionOrStrLabelArgument
@@ -1483,18 +1483,8 @@ def or_(*clauses): # noqa: F811
14831483

14841484
def over(
14851485
element: FunctionElement[_T],
1486-
partition_by: Optional[
1487-
Union[
1488-
Iterable[_ColumnExpressionArgument[Any]],
1489-
_ColumnExpressionArgument[Any],
1490-
]
1491-
] = None,
1492-
order_by: Optional[
1493-
Union[
1494-
Iterable[_ColumnExpressionArgument[Any]],
1495-
_ColumnExpressionArgument[Any],
1496-
]
1497-
] = None,
1486+
partition_by: Optional[_ByArgument] = None,
1487+
order_by: Optional[_ByArgument] = None,
14981488
range_: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
14991489
rows: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
15001490
) -> Over[_T]:

lib/sqlalchemy/sql/_typing.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from typing import Any
1212
from typing import Callable
1313
from typing import Dict
14+
from typing import Iterable
1415
from typing import Mapping
1516
from typing import NoReturn
1617
from typing import Optional
@@ -198,6 +199,12 @@ def __call__(self, obj: _CE) -> _CE:
198199

199200
_ColumnExpressionOrStrLabelArgument = Union[str, _ColumnExpressionArgument[_T]]
200201

202+
_ByArgument = Union[
203+
Iterable[_ColumnExpressionOrStrLabelArgument[Any]],
204+
_ColumnExpressionOrStrLabelArgument[Any],
205+
]
206+
"""Used for keyword-based ``order_by`` and ``partition_by`` parameters."""
207+
201208

202209
_InfoType = Dict[Any, Any]
203210
"""the .info dictionary accepted and used throughout Core /ORM"""

lib/sqlalchemy/sql/elements.py

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
from ..util.typing import Self
8181

8282
if typing.TYPE_CHECKING:
83+
from ._typing import _ByArgument
8384
from ._typing import _ColumnExpressionArgument
8485
from ._typing import _ColumnExpressionOrStrLabelArgument
8586
from ._typing import _InfoType
@@ -4191,18 +4192,8 @@ class Over(ColumnElement[_T]):
41914192
def __init__(
41924193
self,
41934194
element: ColumnElement[_T],
4194-
partition_by: Optional[
4195-
Union[
4196-
Iterable[_ColumnExpressionArgument[Any]],
4197-
_ColumnExpressionArgument[Any],
4198-
]
4199-
] = None,
4200-
order_by: Optional[
4201-
Union[
4202-
Iterable[_ColumnExpressionArgument[Any]],
4203-
_ColumnExpressionArgument[Any],
4204-
]
4205-
] = None,
4195+
partition_by: Optional[_ByArgument] = None,
4196+
order_by: Optional[_ByArgument] = None,
42064197
range_: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
42074198
rows: Optional[typing_Tuple[Optional[int], Optional[int]]] = None,
42084199
):
@@ -5204,12 +5195,12 @@ def _find_columns(clause: ClauseElement) -> Set[ColumnClause[Any]]:
52045195
return cols
52055196

52065197

5207-
def _type_from_args(args):
5198+
def _type_from_args(args: Sequence[ColumnElement[_T]]) -> TypeEngine[_T]:
52085199
for a in args:
52095200
if not a.type._isnull:
52105201
return a.type
52115202
else:
5212-
return type_api.NULLTYPE
5203+
return type_api.NULLTYPE # type: ignore
52135204

52145205

52155206
def _corresponding_column_or_error(fromclause, column, require_embedded=False):

0 commit comments

Comments
 (0)