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 return type of CancelScope.__exit__ such that it can suppresses errors #94

Merged
merged 1 commit into from
Aug 9, 2024

Conversation

rsokl
Copy link
Contributor

@rsokl rsokl commented Aug 9, 2024

The current return type of CancelScope.__exit__ is bool | None, which tells type checkers that CancelScope cannot suppress errors:

https://typing.readthedocs.io/en/latest/spec/exceptions.html#context-managers

If the return type of the exit method is specifically bool or Literal[True], a type checker should assume that exceptions can be suppressed. For any other return type, a type checker should assume that exceptions are not suppressed. Examples include: Any, Literal[False], None, and bool | None.

This is bad. If there were ever a context manager that could suppress errors, it would be CancelScope 😄

Given:

def f()
    with trio.move_on_after(10):
        while True:
            await trio.sleep(20)
            return 2
     return None

Before: pyright says the return type of f is int. I.e. it thinks the return None is unreachable
After: pyright says the return type of f is int | None, which is correct.

@oremanj oremanj merged commit 0936804 into python-trio:master Aug 9, 2024
8 of 9 checks passed
@trio-bot
Copy link

trio-bot bot commented Aug 9, 2024

Hey @rsokl, it looks like that was the first time we merged one of your PRs! Thanks so much! 🎉 🎂

If you want to keep contributing, we'd love to have you. So, I just sent you an invitation to join the python-trio organization on Github! If you accept, then here's what will happen:

  • Github will automatically subscribe you to notifications on all our repositories. (But you can unsubscribe again if you don't want the spam.)

  • You'll be able to help us manage issues (add labels, close them, etc.)

  • You'll be able to review and merge other people's pull requests

  • You'll get a [member] badge next to your name when participating in the Trio repos, and you'll have the option of adding your name to our member's page and putting our icon on your Github profile (details)

If you want to read more, here's the relevant section in our contributing guide.

Alternatively, you're free to decline or ignore the invitation. You'll still be able to contribute as much or as little as you like, and I won't hassle you about joining again. But if you ever change your mind, just let us know and we'll send another invitation. We'd love to have you, but more importantly we want you to do whatever's best for you.

If you have any questions, well... I am just a humble Python script, so I probably can't help. But please do post a comment here, or in our chat, or on our forum, whatever's easiest, and someone will help you out!

@oremanj
Copy link
Member

oremanj commented Aug 9, 2024

@rsokl Thank you for the fix, but please note that trio-typing is somewhat unloved now that trio comes with built-in support for type hints. Please consider using those instead - they were already correct in this respect :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants