-
Notifications
You must be signed in to change notification settings - Fork 1.7k
[ty] Don't confuse multiple occurrences of typing.Self when binding bound methods
#21754
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
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Diagnostic diff on typing conformance testsNo changes detected when running ty on typing conformance tests ✅ |
|
ibraheemdev
approved these changes
Dec 2, 2025
Member
ibraheemdev
left a comment
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.
Nice!
dcreager
added a commit
that referenced
this pull request
Dec 2, 2025
* origin/main: (67 commits) Move `Token`, `TokenKind` and `Tokens` to `ruff-python-ast` (#21760) [ty] Don't confuse multiple occurrences of `typing.Self` when binding bound methods (#21754) Use our org-wide Renovate preset (#21759) Delete `my-script.py` (#21751) [ty] Move `all_members`, and related types/routines, out of `ide_support.rs` (#21695) [ty] Fix find-references for import aliases (#21736) [ty] add tests for workspaces (#21741) [ty] Stop testing the (brittle) constraint set display implementation (#21743) [ty] Use generator over list comprehension to avoid cast (#21748) [ty] Add a diagnostic for prohibited `NamedTuple` attribute overrides (#21717) [ty] Fix subtyping with `type[T]` and unions (#21740) Use `npm ci --ignore-scripts` everywhere (#21742) [`flake8-simplify`] Fix truthiness assumption for non-iterable arguments in tuple/list/set calls (`SIM222`, `SIM223`) (#21479) [`flake8-use-pathlib`] Mark fixes unsafe for return type changes (`PTH104`, `PTH105`, `PTH109`, `PTH115`) (#21440) [ty] Fix auto-import code action to handle pre-existing import Enable PEP 740 attestations when publishing to PyPI (#21735) [ty] Fix find references for type defined in stub (#21732) Use OIDC instead of codspeed token (#21719) [ty] Exclude `typing_extensions` from completions unless it's really available [ty] Fix false positives for `class F(Generic[*Ts]): ...` (#21723) ...
AlexWaygood
pushed a commit
that referenced
this pull request
Dec 2, 2025
… bound methods (#21754) In the following example, there are two occurrences of `typing.Self`, one for `Foo.foo` and one for `Bar.bar`: ```py from typing import Self, reveal_type class Foo[T]: def foo(self: Self) -> T: raise NotImplementedError class Bar: def bar(self: Self, x: Foo[Self]): # SHOULD BE: bound method Foo[Self@bar].foo() -> Self@bar # revealed: bound method Foo[Self@bar].foo() -> Foo[Self@bar] reveal_type(x.foo) def f[U: Bar](x: Foo[U]): # revealed: bound method Foo[U@f].foo() -> U@f reveal_type(x.foo) ``` When accessing a bound method, we replace any occurrences of `Self` with the bound `self` type. We were doing this correctly for the second reveal. We would first apply the specialization, getting `(self: Self@foo) -> U@F` as the signature of `x.foo`. We would then bind the `self` parameter, substituting `Self@foo` with `Foo[U@F]` as part of that. The return type was already specialized to `U@F`, so that substitution had no further affect on the type that we revealed. In the first reveal, we would follow the same process, but we confused the two occurrences of `Self`. We would first apply the specialization, getting `(self: Self@foo) -> Self@bar` as the method signature. We would then try to bind the `self` parameter, substituting `Self@foo` with `Foo[Self@bar]`. However, because we didn't distinguish the two separate `Self`s, and applied the substitution to the return type as well as to the `self` parameter. The fix is to track which particular `Self` we're trying to substitute when applying the type mapping. Fixes astral-sh/ty#1713
dcreager
added a commit
that referenced
this pull request
Dec 3, 2025
* origin/main: [ty] Improve `@override`, `@final` and Liskov checks in cases where there are multiple reachable definitions (#21767) [ty] Extend `invalid-explicit-override` to also cover properties decorated with `@override` that do not override anything (#21756) [ty] Enable LRU collection for parsed module (#21749) [ty] Support typevar-specialized dynamic types in generic type aliases (#21730) Add token based `parenthesized_ranges` implementation (#21738) [ty] Default-specialization of generic type aliases (#21765) [ty] Suppress false positives when `dataclasses.dataclass(...)(cls)` is called imperatively (#21729) [syntax-error] Default type parameter followed by non-default type parameter (#21657) new module for parsing ranged suppressions (#21441) [ty] `type[T]` is assignable to an inferable typevar (#21766) Fix syntax error false positives for `await` outside functions (#21763) [ty] Improve diagnostics for unsupported comparison operations (#21737) Move `Token`, `TokenKind` and `Tokens` to `ruff-python-ast` (#21760) [ty] Don't confuse multiple occurrences of `typing.Self` when binding bound methods (#21754) Use our org-wide Renovate preset (#21759) Delete `my-script.py` (#21751) [ty] Move `all_members`, and related types/routines, out of `ide_support.rs` (#21695)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
In the following example, there are two occurrences of
typing.Self, one forFoo.fooand one forBar.bar:When accessing a bound method, we replace any occurrences of
Selfwith the boundselftype.We were doing this correctly for the second reveal. We would first apply the specialization, getting
(self: Self@foo) -> U@Fas the signature ofx.foo. We would then bind theselfparameter, substitutingSelf@foowithFoo[U@F]as part of that. The return type was already specialized toU@F, so that substitution had no further affect on the type that we revealed.In the first reveal, we would follow the same process, but we confused the two occurrences of
Self. We would first apply the specialization, getting(self: Self@foo) -> Self@baras the method signature. We would then try to bind theselfparameter, substitutingSelf@foowithFoo[Self@bar]. However, because we didn't distinguish the two separateSelfs, and applied the substitution to the return type as well as to theselfparameter.The fix is to track which particular
Selfwe're trying to substitute when applying the type mapping.Fixes astral-sh/ty#1713