-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Better handling of Any/object in variadic generics #18643
Conversation
This comment has been minimized.
This comment has been minimized.
Hm, this exposed an inconsistency in instance vs type variable join. Let me try a principled first, but if there will be fallout, I will limit it to the variadic cases only. |
Actually, after all I decided not to open this can of worms, let's limit the fix for uncovered inconsistency to variadic generics. |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Pinging on review here, if there are no objections I will be merging this soon. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, another 3 bugs fixed! I didn't try to fully understand every single thing, but looks good overall. Left a minor suggestion about test coverage.
def join(x: T, y: T) -> T: ... | ||
def test(xs: tuple[Unpack[Ts]], xsi: tuple[int, Unpack[Ts]]) -> None: | ||
a: tuple[Any, ...] | ||
reveal_type(join(xs, a)) # N: Revealed type is "builtins.tuple[Any, ...]" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also try the opposite argument order (join(a, xs)
) here and below?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, added symmetric check for each pair.
According to mypy_primer, this change doesn't affect type check results on a corpus of open source code. ✅ |
Fixes python#18407 Fixes python#17184 Fixes python#16567 There are three things here: * Allow erased variadic callables with non-empty prefix to be supertypes of the non-erased ones. This relaxes a bit callable subtyping in general, but IMO this makes sense, people who want to be strict should simply use `*args: object` instead. An alternative would be to track erased variadic callables explicitly, which is ugly and fragile. * Add important missing case in `subtypes.py` for `*Ts` w.r.t. `Any`/`object` that handles similar situations for variadic instances and tuples (here however there is nothing special about `Any` vs `object`). * I also fix inconsistency in join uncovered by the above two. The changes in `expandtype.py` are no-op, I just noticed potential danger while playing with this, so wanted to highlight it with comments for the future.
Fixes python#18407 Fixes python#17184 Fixes python#16567 There are three things here: * Allow erased variadic callables with non-empty prefix to be supertypes of the non-erased ones. This relaxes a bit callable subtyping in general, but IMO this makes sense, people who want to be strict should simply use `*args: object` instead. An alternative would be to track erased variadic callables explicitly, which is ugly and fragile. * Add important missing case in `subtypes.py` for `*Ts` w.r.t. `Any`/`object` that handles similar situations for variadic instances and tuples (here however there is nothing special about `Any` vs `object`). * I also fix inconsistency in join uncovered by the above two. The changes in `expandtype.py` are no-op, I just noticed potential danger while playing with this, so wanted to highlight it with comments for the future.
Fixes python#18407 Fixes python#17184 Fixes python#16567 There are three things here: * Allow erased variadic callables with non-empty prefix to be supertypes of the non-erased ones. This relaxes a bit callable subtyping in general, but IMO this makes sense, people who want to be strict should simply use `*args: object` instead. An alternative would be to track erased variadic callables explicitly, which is ugly and fragile. * Add important missing case in `subtypes.py` for `*Ts` w.r.t. `Any`/`object` that handles similar situations for variadic instances and tuples (here however there is nothing special about `Any` vs `object`). * I also fix inconsistency in join uncovered by the above two. The changes in `expandtype.py` are no-op, I just noticed potential danger while playing with this, so wanted to highlight it with comments for the future.
Fixes #18407
Fixes #17184
Fixes #16567
There are three things here:
*args: object
instead. An alternative would be to track erased variadic callables explicitly, which is ugly and fragile.subtypes.py
for*Ts
w.r.t.Any
/object
that handles similar situations for variadic instances and tuples (here however there is nothing special aboutAny
vsobject
).The changes in
expandtype.py
are no-op, I just noticed potential danger while playing with this, so wanted to highlight it with comments for the future.