Title: [1.20 regression] no longer accepts the empty tuple for `except ...:` · Issue #21152 · python/mypy · GitHub
Open Graph Title: [1.20 regression] no longer accepts the empty tuple for `except ...:` · Issue #21152 · python/mypy
X Title: [1.20 regression] no longer accepts the empty tuple for `except ...:` · Issue #21152 · python/mypy
Description: Bug Report mypy 1.20 no longer considers the empty tuple as a valid argument to except ...: unless it is explicitly annotated to be a (potentially empty) tuple of exception types. May be related to #17762 since the PR seems to be the las...
Open Graph Description: Bug Report mypy 1.20 no longer considers the empty tuple as a valid argument to except ...: unless it is explicitly annotated to be a (potentially empty) tuple of exception types. May be related to...
X Description: Bug Report mypy 1.20 no longer considers the empty tuple as a valid argument to except ...: unless it is explicitly annotated to be a (potentially empty) tuple of exception types. May be related to...
Opengraph URL: https://github.com/python/mypy/issues/21152
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[1.20 regression] no longer accepts the empty tuple for `except ...:`","articleBody":"\u003c!--\nIf you're not sure whether what you're experiencing is a mypy bug, please see the \"Question and Help\" form instead.\nPlease consider:\n\n- checking our common issues page: https://mypy.readthedocs.io/en/stable/common_issues.html\n- searching our issue tracker: https://github.com/python/mypy/issues to see if it's already been reported\n- asking on gitter chat: https://gitter.im/python/typing\n--\u003e\n\n**Bug Report**\n\n\u003c!--\nIf you're reporting a problem with a specific library function, the typeshed tracker is better suited for this report: https://github.com/python/typeshed/issues\n\nIf the project you encountered the issue in is open source, please provide a link to the project.\n--\u003e\n\n`mypy` 1.20 no longer considers the empty tuple as a valid argument to `except ...:` unless it is explicitly annotated to be a (potentially empty) tuple of exception types. May be related to #17762 since the PR seems to be the last one that touched the exception-type-tuple handling for try-except block. \n\n(Same context as #21149: the [repo](https://gitlab.com/TTsangSC/pytest-autoprofile), the [failed pipeline](https://gitlab.com/TTsangSC/pytest-autoprofile/-/jobs/13742751853#L122), and the caveat about `mypy`-version behaviors [not lining up between `mypy` Playground and PyPI releases](https://github.com/python/mypy/issues/21149#user-content-fn-disclaimer-version-inconsistency-b9a62aedca4482d8cecd2b62fb6ffe81).)\n\n**To Reproduce**\n\n(Gist: https://gist.github.com/mypy-play/d0bd152e2e868b693ca73079096d13c6)\n\n```python\ndef this_no_longer_works() -\u003e None:\n try:\n pass\n except ():\n assert False, 'This should be unreachable'\n \n\ndef but_this_still_does() -\u003e None:\n accepted_errors: tuple[type[Exception], ...] = ()\n try:\n pass\n except accepted_errors:\n pass\n```\n\n(The real repo code of course doesn't just do a redundant `try: ... except: ...`, but uses it for e.g. [optional post-mortem debugging](https://gitlab.com/TTsangSC/pytest-autoprofile/-/blob/v0.19.1/.mock-ci/pytest_autoprofile_local_ci/cli.py?ref_type=tags#L368).)\n\n**Expected Behavior**\n\nType-check passes as with before\n\n**Actual Behavior**\n\n```log\nmain.py:4: error: Exception type must be derived from BaseException (or be a tuple of exception classes) [misc]\nFound 1 error in 1 file (checked 1 source file)\n```\n\n**Your Environment**\n\n\u003c!-- Include as many relevant details about the environment you experienced the bug in --\u003e\n\n- Mypy version used: master (on Playground)\n- Mypy command-line flags: nil\n- Mypy configuration options from `mypy.ini` (and other config files): nil\n- Python version used: 3.14\n\n\u003c!-- You can freely edit this text, please remove all the lines you believe are unnecessary. --\u003e\n","author":{"url":"https://github.com/TTsangSC","@type":"Person","name":"TTsangSC"},"datePublished":"2026-04-02T22:59:12.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/21152/mypy/issues/21152"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:df5a665a-fbf2-15b4-d62a-0a06cb3f2925 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | B87A:31738E:13FEA6B:1C8EB5C:6A58CA31 |
| html-safe-nonce | ae7a9553adff4e33f841e735827ad3e1d8eda2613736adfba4fbffb082ea8890 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCODdBOjMxNzM4RToxM0ZFQTZCOjFDOEVCNUM6NkE1OENBMzEiLCJ2aXNpdG9yX2lkIjoiMzcyMjIzMjE4MDUwMTk1NzE2OSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 644c01db728bbc0802352ae2ccd3c747e87b70273d2c16591262e498ce07910e |
| hovercard-subject-tag | issue:4197372058 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/mypy/21152/issue_layout |
| twitter:image | https://opengraph.githubassets.com/f7ff9ffb84be5c125445b923a0073458f0e0c3590f01a2dedf698221120d3a20/python/mypy/issues/21152 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/f7ff9ffb84be5c125445b923a0073458f0e0c3590f01a2dedf698221120d3a20/python/mypy/issues/21152 |
| og:image:alt | Bug Report mypy 1.20 no longer considers the empty tuple as a valid argument to except ...: unless it is explicitly annotated to be a (potentially empty) tuple of exception types. May be related to... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | TTsangSC |
| hostname | github.com |
| expected-hostname | github.com |
| None | 5f2a0c7865178af3d91dd9f13b0cdfc3c73a2529c873d2780bb4c01271a57ec6 |
| turbo-cache-control | no-preview |
| go-import | github.com/python/mypy git https://github.com/python/mypy.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 7053637 |
| octolytics-dimension-repository_nwo | python/mypy |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 7053637 |
| octolytics-dimension-repository_network_root_nwo | python/mypy |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 8aae7b8d6caacacf5c66eaeb2702d8dc88d85b4a |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width