PEP: https://peps.python.org/pep-0830/
Реализация: https://github.com/python/cpython/pull/129337
Обсуждение: https://discuss.python.org/t/pep-830-add-timestamps-to-exceptions-and-tracebacks/106942
Идея - просто отличная. Практически все внешние трекеры ошибок вроде Сентри - уже давно добавляют время ошибки к самому исключению.
А сейчас в 3.15+ такое будет делаться нативно.
Особенно полезно оно будет в
ExceptionGroup для сортировки группы. Пример:
import asyncio
async def fetch_user(uid):
await asyncio.sleep(0.5)
raise ConnectionError(f"User service timeout for {uid}")
async def fetch_orders(uid):
await asyncio.sleep(0.1)
raise ValueError(f"Invalid user_id format: {uid}")
async def fetch_recommendations(uid):
await asyncio.sleep(2.3)
raise TimeoutError("Recommendation service timeout")
async def get_dashboard(uid):
results = await asyncio.gather(
fetch_user(uid),
fetch_orders(uid),
fetch_recommendations(uid),
return_exceptions=True,
)
errors = [r for r in results if isinstance(r, Exception)]
if errors:
raise ExceptionGroup("dashboard fetch failed", errors)
asyncio.run(get_dashboard("usr_12@34"))
С переменной окружения
PYTHON_TRACEBACK_TIMESTAMPS=iso питон будет выводить:
+ Exception Group Traceback (most recent call last):
| File "service.py", line 26, in <module>
| asyncio.run(get_dashboard("usr_12@34"))
| ...
| File "service.py", line 24, in get_dashboard
| raise ExceptionGroup("dashboard fetch failed", errors)
| ExceptionGroup: dashboard fetch failed (3 sub-exceptions) <@2026-04-19T07:24:31.102431Z>
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "service.py", line 5, in fetch_user
| raise ConnectionError(f"User service timeout for {uid}")
| ConnectionError: User service timeout for usr_12@34 <@2026-04-19T07:24:29.300461Z>
+---------------- 2 ----------------
| Traceback (most recent call last):
| File "service.py", line 9, in fetch_orders
| raise ValueError(f"Invalid user_id format: {uid}")
| ValueError: Invalid user_id format: usr_12@34 <@2026-04-19T07:24:28.899918Z>
+---------------- 3 ----------------
| Traceback (most recent call last):
| File "service.py", line 13, in fetch_recommendations
| raise TimeoutError("Recommendation service timeout")
| TimeoutError: Recommendation service timeout <@2026-04-19T07:24:31.102394Z>
+----------------------------------—
Обратная совместимость
Данная фича будет включаться только при использовании переменной окружения
PYTHON_TRACEBACK_TIMESTAMPS или флага сборки питона -X traceback_timestamps=<format>.Поддерживаемые форматы:
•
ns для отображения таймстампов с точностью до наносекунд <@1776017178.687320256>•
iso для отображения datetime в iso форматеТак же будет добавлен новый атрибут
BaseException.__timestamp_ns__, который будет хранить непосредственное время для отображения. Он будет записываться всегда и всегда в формате наносекунд. Но, значение будет не 0, только с проставленной конфигурацией:
>>> try:
... raise ValueError('demo')
... except ValueError as exc:
... saved = exc
>>> # Без флага
>>> saved.__timestamp_ns__
0
>>> # С флагом `PYTHON_TRACEBACK_TIMESTAMPS=iso`
>>> saved.__timestamp_ns__
1776935887649972000
Перф
Никаких значимых изменений замечено не было. Кроме случаев с control flow, которые будут исключены из данной логики.
Оффтоп
Если вы думаете, какой пакет уже попал в
awesome-python в секцию Web APIs для Django наравне с django-rest-framework, то да, можно поздравить :) И в awesome-django тоже 😊Обсуждение: Какие у вас лучшие практики логгирования исключений? Как-то работаете с группами по-особому? Видите ли вы применение у себя в проекте?
Update: в обсуждении вскрылось много подводных камней, заходите читать комменты.
| Поддержать | YouTube | GitHub | Чат |