TGViewer
Находки в опенсорсе Находки в опенсорсе @opensource_findings · 12.6K subscribers
Post #908 12.5K
PEP 758: except и except* без ()

- PEP: https://peps.python.org/pep-0758
- PR: https://github.com/python/cpython/pull/131833

В 3.14 мы теперь можем не указывать скобки в except и except*, когда мы ловим несколько типов исключений и не используем as, пример:


>>> try:
... res = int(data['value'])
... except ValueError, KeyError:
... res = 0


Раньше нам необходимо было писать так:


>>> try:
... res = int(data['value'])
... except (ValueError, KeyError):
... res = 0


Удобно? Удобно. Однако, когда есть as мы все еще должны использовать скобки:


>>> try:
... res = int(data['value'])
... except ValueError, KeyError as exc:
... res = 0
...
File "<python-input-3>", line 3
except ValueError, KeyError as exc:
^^^^^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: multiple exception types must be parenthesized when using 'as'


Правильно будет так:


>>> try:
... res = int(data['value'])
... except (ValueError, KeyError) as exc:
... res = 0


Как работает?

На самом деле – изменение очень маленькое, что позволит нам сфокусироваться на работе парсера. Смотрите, было:


except_block[excepthandler_ty]:
| invalid_except_stmt_indent
| 'except' e=expression t=['as' z=NAME { z }] ':' b=block {
_PyAST_ExceptHandler(e, (t) ? ((expr_ty) t)->v.Name.id : NULL, b, EXTRA) }
| 'except' ':' b=block { _PyAST_ExceptHandler(NULL, NULL, b, EXTRA) }


Стало:


except_block[excepthandler_ty]:
| invalid_except_stmt_indent
| 'except' e=expressions ':' b=block {
_PyAST_ExceptHandler(e, NULL, b, EXTRA) }
| 'except' e=expression 'as' t=NAME ':' b=block {
_PyAST_ExceptHandler(e, ((expr_ty) t)->v.Name.id, b, EXTRA) }
| 'except' ':' b=block { _PyAST_ExceptHandler(NULL, NULL, b, EXTRA) }


Что тут есть что?
1. except_block большое правило, которое умеет парсить except в его разных видах. excepthandler_ty – его Cшный тип, такое упрощение для кодогенерации конечного parser.c
2. через | указаны варианты, какие могут быть грамматически корректные except в Python
3. первое правило – особенное, все правила с префиксом invalid_ – работают только на второй прогон парсера, чтобы показывать более качественные ошибки пользователям
4. второе правило – ключевое слово except, потом любые выражения, но без as
5. третье правило – ключевое слово except, потом любое одно выражение, далее as

Разница, что раньше не было пункта 4., а as был опциональный (внутри [] скобок в описании грамматики)

Вот такое простое, но довольно удобное изменение.

Обсуждение: какой стиль вы выберете у себя в команде?
Extra: кстати, в коде новой грамматики из PR (который я привел выше) была ошибка, которую я уже исправил. Нашли?

| Поддержать | YouTube | GitHub | Чат |
Python Enhancement Proposals (PEPs) PEP 758 – Allow except and except* expressions without parentheses | peps.python.org This PEP 1 proposes to allow unparenthesized except and except* blocks in Python’s exception handling syntax only when not using the as clause. Currently, when catching multiple exceptions, parentheses are required around the exception types. This was a...
  • ❤ 33
  • 👍 23
  • 🔥 16
  • 👎 5
  • 🤔 5
  • 🤡 1
More from @opensource_findings
  1. Sep 25, 2026Монадические выражения в Python. Наконец-то! Продолжаем разговор про интересные PEPы. Пого…
  2. Sep 15, 2026PEPы в Python окончательно вышли из-под контроля Давайте посмотрим, что происходит с ПЕПам…
  3. Sep 10, 2026Большая бесплатная конференция в Нижнем Новгороде 17 октября Регистрация: https://itgorky.…
  4. Sep 1, 2026Post #985
  5. Aug 24, 2026JIT могут удалить из CPython! PEP-836: https://peps.python.org/pep-0836 JIT в CPython имее…
  6. Aug 18, 2026Как AWS у опенсорсера пакеты отжимал Нерегулярная рубрика "посмотрите, что творится!". Дан…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →