tgoop.com/opensource_findings/908
Create:
Last Update:
Last Update:
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.c2. через
| указаны варианты, какие могут быть грамматически корректные except в Python3. первое правило – особенное, все правила с префиксом
invalid_ – работают только на второй прогон парсера, чтобы показывать более качественные ошибки пользователям4. второе правило – ключевое слово
except, потом любые выражения, но без as5. третье правило – ключевое слово
except, потом любое одно выражение, далее asРазница, что раньше не было пункта
4., а as был опциональный (внутри [] скобок в описании грамматики)Вот такое простое, но довольно удобное изменение.
Обсуждение: какой стиль вы выберете у себя в команде?
Extra: кстати, в коде новой грамматики из PR (который я привел выше) была ошибка, которую я уже исправил. Нашли?
| Поддержать | YouTube | GitHub | Чат |
BY Находки в опенсорсе

Share with your friend now:
tgoop.com/opensource_findings/908
