From 6f710b393a9d041249d26589b11a7e35a29c3288 Mon Sep 17 00:00:00 2001 From: Iuri de Silvio Date: Thu, 12 Oct 2023 08:25:40 -0400 Subject: [PATCH] Make Values().data input covariant with Sequence Fixed typing issue where the argument list passed to :class:`.Values` was too-restrictively tied to ``List`` rather than ``Sequence``. Pull request courtesy Iuri de Silvio. Fixes: #10451 Closes: #10452 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/10452 Pull-request-sha: 7800f0d631f75b716b8870755e5d0a3fbe950277 Change-Id: If631455d049b2308ec42602b72a60a5ede35fa32 --- doc/build/changelog/unreleased_20/10451.rst | 7 +++++++ lib/sqlalchemy/sql/selectable.py | 6 +++--- test/typing/plain_files/sql/lowercase_objects.py | 8 ++++++-- 3 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 doc/build/changelog/unreleased_20/10451.rst diff --git a/doc/build/changelog/unreleased_20/10451.rst b/doc/build/changelog/unreleased_20/10451.rst new file mode 100644 index 0000000000..12f1a90ecf --- /dev/null +++ b/doc/build/changelog/unreleased_20/10451.rst @@ -0,0 +1,7 @@ +.. change:: + :tags: bug, typing + :tickets: 10451 + + Fixed typing issue where the argument list passed to :class:`.Values` was + too-restrictively tied to ``List`` rather than ``Sequence``. Pull request + courtesy Iuri de Silvio. diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py index debeb8bb87..91b939e0af 100644 --- a/lib/sqlalchemy/sql/selectable.py +++ b/lib/sqlalchemy/sql/selectable.py @@ -3149,7 +3149,7 @@ class Values(roles.InElementRole, Generative, LateralFromClause): __visit_name__ = "values" - _data: Tuple[List[Tuple[Any, ...]], ...] = () + _data: Tuple[Sequence[Tuple[Any, ...]], ...] = () _unnamed: bool _traverse_internals: _TraverseInternalsType = [ @@ -3233,7 +3233,7 @@ class Values(roles.InElementRole, Generative, LateralFromClause): return self @_generative - def data(self, values: List[Tuple[Any, ...]]) -> Self: + def data(self, values: Sequence[Tuple[Any, ...]]) -> Self: """Return a new :class:`_expression.Values` construct, adding the given data to the data list. @@ -3300,7 +3300,7 @@ class ScalarValues(roles.InElementRole, GroupedElement, ColumnElement[Any]): def __init__( self, columns: Sequence[ColumnClause[Any]], - data: Tuple[List[Tuple[Any, ...]], ...], + data: Tuple[Sequence[Tuple[Any, ...]], ...], literal_binds: bool, ): super().__init__() diff --git a/test/typing/plain_files/sql/lowercase_objects.py b/test/typing/plain_files/sql/lowercase_objects.py index ab26d7ede3..21d9a4595a 100644 --- a/test/typing/plain_files/sql/lowercase_objects.py +++ b/test/typing/plain_files/sql/lowercase_objects.py @@ -8,9 +8,13 @@ Book = sa.table( Book.append_column(sa.column("other")) Book.corresponding_column(Book.c.id) -value_expr = sa.values( +values = sa.values( sa.column("id", sa.Integer), sa.column("name", sa.String), name="my_values" -).data([(1, "name1"), (2, "name2"), (3, "name3")]) +) +value_expr = values.data([(1, "name1"), (2, "name2"), (3, "name3")]) + +data: list[tuple[int, str]] = [(1, "name1"), (2, "name2"), (3, "name3")] +value_expr2 = values.data(data) sa.select(Book) sa.select(sa.literal_column("42"), sa.column("foo")).select_from(sa.table("t")) -- 2.47.3