Skip to content
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

fix(typing): improve view type inference of ui decorators #1190

Merged
merged 12 commits into from
Dec 28, 2024

Conversation

shiftinv
Copy link
Member

@shiftinv shiftinv commented May 10, 2024

Summary

This adjusts some internal typings to get rid of Unknowns in button/select decorators.

  • view_cls.method now has a properly typed (Self@V, Item[Self@V], MsgInter) signature, instead of (Any, Unknown, MsgInter)
  • more importantly, self.method now returns an Item[Self@V] with the correctly bound view type, instead of Item[V_co], which was unbound and didn't allow accessing custom attributes on self.method.view
class CustomView(disnake.ui.View):
    x: int

    @disnake.ui.string_select(options=["A", "B"])
    async def sel(self, s, i):
        # before: StringSelect[V_co@string_select]  # <<< note, view type unbound
        # after: StringSelect[Self@CustomView]
        reveal_type(self.sel)

        # before: (Any, Unknown, MessageInteraction[Unknown]) -> Coroutine[Any, Any, Any]
        # after: (CustomView, StringSelect[Self@CustomView], MessageInteraction[Unknown]) -> Coroutine[Any, Any, Any]
        reveal_type(type(self).sel)

        # before: [error]
        # after: int
        reveal_type(self.sel.view.x)

Additionally widens the accepted input types for the cls parameter in decorators to any matching callable, instead of just matching types. The documentation for this hasn't been adjusted (yet?), but there isn't really a reason not to support it.

Checklist

  • If code changes were made, then they have been tested
    • I have updated the documentation to reflect the changes
    • I have formatted the code properly by running pdm lint
    • I have type-checked the code by running pdm pyright
  • This PR fixes an issue
  • This PR adds something new (e.g. new method or parameters)
  • This PR is a breaking change (e.g. methods or parameters removed/renamed)
  • This PR is not a code change (e.g. documentation, README, ...)

shiftinv added 2 commits May 10, 2024 21:16
- view_cls.method now has a properly typed `(Self@V, Item[Self@V], MsgInter)` signature, instead of `(Any, Unknown, MsgInter)`
- more importantly, self.method now returns an `Item[Self@V]` with the correctly bound view type, instead of `Item[V_co]`,
  which was unbound and didn't allow accessing custom attributes on `self.method.view`
@shiftinv shiftinv added t: refactor/typing/lint Refactors, typing changes and/or linting changes skip news labels May 10, 2024
@shiftinv shiftinv added this to the disnake v2.10 milestone May 10, 2024
disnake/ui/item.py Outdated Show resolved Hide resolved
disnake/ui/select/base.py Outdated Show resolved Hide resolved
@shiftinv shiftinv merged commit 4f6a371 into master Dec 28, 2024
30 checks passed
@shiftinv shiftinv deleted the typing/ui-decorator-callback-view branch December 28, 2024 15:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
t: refactor/typing/lint Refactors, typing changes and/or linting changes
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

3 participants