22

Мой взгляд на новые фичи python3.10-3.12

Стабильные минорные версии Python выходят ежегодно, последние 5 лет – в октябре. Мажорные версии, будем надеяться, выходить больше не будут, хватило ада переезда с python2 на python3. В этом октябре нас ожидает python3.13 (мажоная версия 3, минорная 13). Подумалось мне порефлексировать – какие новые фичи питона вошли в мой повседневный код. Пойдём со свежего и будем погружаться в пучины истории, в этой статье дойдём до 3.10. Запускаться будем в докере на python:3.12.5-slim. Код всех примеров лежит тут.

Пример 1: python3.12 – f-строки

В 3.12 меня зацепило обновление f-строк в PEP701. Вообще за много итераций f-строки превратились в мега-удобную штуку. Теперь внутри можно почти что угодно, в том числе вложенные вызовы f-строк с кавычками. Выведем в f-строке значение словаря по ключу:

Пример 1. f-строки на стероидах

Пример 1. f-строки на стероидах

В выводе будет значение ключа:

# при запуске в python3.12

Settings: green

Для старых версий покажу, какая возникает ошибка. Полезно для "насмотренности", когда вы визуально будете отличать, это баг в коде или кто-то использует старый интерпретатор. Раньше так было нельзя, python3.11 и ранее выдаёт ошибку

# при запуске в python3.11 и ранее

print(f"Settings: {settings["color"]}")

^^^^^

SyntaxError: f-string: unmatched '['

Можно вставлять многострочные f-строки и внутри указывать любые валидные python-выражения. Красивое. Это как в 3.8 добавили мега-удобную мелочь: с помощью знака равно после переменной в f-строке мы получаем вывод в формате "название_переменной=значение". Типа

user='Gvido'

>>> print(f"{user=}")

# вывод

user='Gvido'

Пример 2: python3.11 – дополнение к исключениям

У исключений теперь есть метод add_note, с помощью которого можно дополнять порождённое исключение дополнительной информацией. Раньше нужно было либо отдельно логгировать нужное, либо колдовать над классом исключений. Укажем время возникновения исключения:

Пример 2. Дополняем исключения информацией

Пример 2. Дополняем исключения информацией

В 3.11 дополнение (note) будет выведена после самого исключения. Выглядит так:

# при запуске в python3.11

File "/app/examples.py", line 17, in main

1/0

~^~

ZeroDivisionError: division by zero

Except at 2024-08-25 11:14:18.920230

До 3.11 метода add_note не существовало:

# при запуске в python3.10 и ранее

err.add_note(f"Except at {datetime.datetime.now()}")

AttributeError: 'ZeroDivisionError' object has no attribute 'add_note'

В 3.11 также ввели Exception Groups PEP654, но мне синтаксис не очень зашёл. Вы используете?

Пример 3: python3.10 – объединение контекстных менеджеров

Починили объединение контекстных менеджеров (parenthesized context managers). Как я понял, в теории так можно было изначально, на практике это был баг. Под одним with теперь можно собирать множество сущностей:

Пример 3. Объединение внутри with

Пример 3. Объединение внутри with

В 3.10 работает

# при запуске в python3.10

<_io.TextIOWrapper name='/tmp/1' mode='w+' encoding='UTF-8'> <_io.TextIOWrapper name='/tmp/2' mode='w+' encoding='UTF-8'>

А в 3.9 и раньше жалуется на рандомную часть выражения

# при запуске в python3.9 и ранее

with (open("/tmp/1", "w+") as file1,

^

SyntaxError: invalid syntax

Пример 4: python3.10 – pattern matching

Основным нововведением 3.10 считается введение Structural Pattern Matching. В питоне изначально не было switch/case, и вопрос решался либо цепочками elif, либо с помощью словаря. Пример такого словаря можете посмотреть в полном коде к этой статье внизу. Попытка внедрить switch/case была ещё в 2006 году, но тогда решили не вводить. В 2020 году Гвидо ван Россум презентовал новую реализацию, и ещё какую. В case запихнули сразу регулярки. Встречайте: PEP636. Ну, технически 634 вводит этот функционал, а в 636 предлагается туториал. Что теперь можно сделать? Представим, что мы парсим команду, состоящую из действия и объекта, вроде "нажать кнопка"

При запуске в 3.10 после ввода двух слов получаем верный ответ

# при запуске в python3.10

Example 4. Python3.10, PEP636 https://peps.python.org/pep-0636/

Write action and object (example 'push button'): push button

You did 'push' on 'button'

На более старых версиях match не известно

# при запуске в python3.9 и ранее

match command.split():

^

SyntaxError: invalid syntax

В case можно фиксировать какие-то блоки, использовать логическое "или" и переменные

# обработчик для направления или варианта go направление

case ["north"] | ["go", "north"]:

# обработчик для разных вариантов получения объекта get, pick up, pick ... up, при этом сам объект попадёт в переменную obj

case ["get", obj] | ["pick", "up", obj] | ["pick", obj, "up"]:

И в этом match/case ещё много разных вариантов и нюансов. Это и хорошо (потому что мощь), и плохо (потому что разбирать чужой код может быть больно). Про детали у нас в канале был отличный пост.

Какие фичи показались важными вам? Я намеренно опустил всё про типы, это заслуживает отдельной статьи.

Весь проект "на потыкать" лежит тут.

В телеграм-канале DevFM пишу о полезном для разработчика: инструментах вроде parabol или fcron, интересных хаках вроде запуска LLM прямо в шрифте, оптимизаторе join в PostgreSQL. А ещё у нас есть бесплатный курс cli-for-dev по Linux на степике, немного подкастов и видео.

Больше записей о программировании, IT и разработке, а также коде и технологиях ищите по тэгу «Программирование». А если хотите освоить новую профессию — смотрите актуальные курсы от проверенных школ с реальными отзывами на сайте Пикабу Курсы.

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий
Прикольно, не обо всём знал. Что знал из нового - использую активно. В этом смысле ребята молодцы, полезные нововведения придумывают.

А := пользуетесь?
раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Про оператор моржика (walrus), он же := – считаю его злом. Подробнее хочу описать в статье про версии 3.6-3.9. если кратко – в Си-подобных языках присваивание внутри if является известной болью. Типа конструкция


if a = 5


Неожиданно неприятно себя ведёт в си. Это не сравнение, а присваивание. И возвращаемое значение равно правому операнду, то есть почти всегда true. И эту херню плохо видно, это постоянный источник багов. Что в результате? В си это решается стайл гайдом, по которому писать надо


if 5 == a


Первое время выглядит дико, но привыкаешь. Тут компилятор не даст присваивание сделать, так как слева константа.


Иииии тут в питоне за каким-то хреном разрешают присваивание внутри if/while/for. Зачем? Это в большинстве ситуаций только ухудшает читаемость кода, потому что нерадивые разработчики склонны городить адовые условия

раскрыть ветку (3)
1
Автор поста оценил этот комментарий
Давайте честно, If 5 == a – это уродство и дибилизм из нулевых годов, когда компиляторы были тупыми. Сейчас сразу ворнинг вылезет. Подобные стайл-гайды - удел негибких старпёров.

Другое дело - читаемость. В if в подобной конструкции мало смысла, а в while это может быть полезно чтобы не повторять операцию в конце цикла - значит и править потом придётся только в одном месте. Это единственная причина, хотя сам я так и не привык к моржу ;) Один раз хотел использовать, и то отказался.
раскрыть ветку (2)
1
Автор поста оценил этот комментарий

С ворнингами беда в том, что их видно только при общем дисциплине команды, когда ворнингов должно быть 0. В противном случае у вас будет сотня ворнингов и проблему в if вы пропустите


Конечно, иногда удобнее присвоить в цикле. Но в результате бесконтрольного применения будет как с лямбдами – сложные не читаемые конструкции, за которые следует руки отрубать. При этом плюс от выноса присваивания в заголовок цикла несущественно улучшает код. В результате потенциальная выгода куда меньше потенциального же ущерба


Вывод – моржик фу, не применяйте ;)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Думаю, вы правы. Хоть и не люблю повторы присваиваний, но предсказуемость важнее
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества