OPENSOURCE_FINDINGS Telegram 908
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 | Чат |
433👍23🔥16👎5🤔5🤡1



tgoop.com/opensource_findings/908
Create:
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.c
2. через | указаны варианты, какие могут быть грамматически корректные except в Python
3. первое правило – особенное, все правила с префиксом invalid_ – работают только на второй прогон парсера, чтобы показывать более качественные ошибки пользователям
4. второе правило – ключевое слово except, потом любые выражения, но без as
5. третье правило – ключевое слово except, потом любое одно выражение, далее as

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

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

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

| Поддержать | YouTube | GitHub | Чат |

BY Находки в опенсорсе




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

View MORE
Open in Telegram


Telegram News

Date: |

As of Thursday, the SUCK Channel had 34,146 subscribers, with only one message dated August 28, 2020. It was an announcement stating that police had removed all posts on the channel because its content “contravenes the laws of Hong Kong.” The imprisonment came as Telegram said it was "surprised" by claims that privacy commissioner Ada Chung Lai-ling is seeking to block the messaging app due to doxxing content targeting police and politicians. Telegram offers a powerful toolset that allows businesses to create and manage channels, groups, and bots to broadcast messages, engage in conversations, and offer reliable customer support via bots. Activate up to 20 bots The SUCK Channel on Telegram, with a message saying some content has been removed by the police. Photo: Telegram screenshot.
from us


Telegram Находки в опенсорсе
FROM American