2 октября 2023 года состоялся релиз обновления языка программирования Python 3.12. Разработчики поработали над оптимизацией, улучшили сообщения об ошибках и прокачали f-строки. Подробно рассказываем о нововведениях и изменениях в Python.
Как обновить Python
Текущую установленную версию можно проверить с помощью команды
python -version или python3 -version. После этого в терминале появится номер версии.
Как обновить Python на Windows
- Скачать установочный файл с официального сайта и запустить его. Система автоматически пройдется по шагам установки и выполнит все подготовительные действия.
- Установить Python 3.12 из магазина приложений Microsoft Store.
Как обновить Python на macOS
- Можно также использовать установочный файл с официального сайта. После загрузки необходимо открыть его, принять пользовательское соглашение и установить обновление.
- Для скачивания сторонних пакетов на macOS обычно используют менеджер Homebrew. Для обновления с его помощью необходимо поочередно выполнить следующие команды:
brew update brew install python brew upgrade python
Как обновить Python на Linux
- Можно использовать репозиторий APT, в котором всегда находятся последние версии программ и инструментов. Для этого надо выполнить следующие команды в терминале:
sudo apt-get update sudo apt-get upgrade
F-строки
Поддержка f-строк появилась в Python 3.6. С их помощью разработчики могут быстрее и удобнее интерполировать строки, используя простой синтаксис. В качестве примера базового использования f-строк можно привести вывод значений переменных:
print(f"{a} + {b} = {sum}")
С самого начала возможности f-строки были ограничены и пользователи не могли реализовывать с их помощью сложные конструкции. Это было связано с использованием отдельного парсера. В Python 3.9 внедрили парсер PEG, а в 3.12 перевели на него f-строки. Благодаря этому они обрабатываются как обычный код Python.
В первую очередь это будет полезно тем, кто разрабатывает сам Python, но и обычные программисты смогут пользоваться новыми фишками. Вот некоторые из них:
- Повторное использование кавычек. Так как теперь в f-строку можно передавать выражения, повторное использование кавычек не составляет труда. С их помощью можно обращаться к структурам данных по ключу и выводить значение. В прошлых версиях Python выдал бы ошибку.
device = { "type": "phone", "model": "iPhone 15 Pro", "price": 1500, "currency": "USD" } print(f"Phone model: {device["model"]}") >>> Phone model: iPhone 15 Pro
- Обратные слэши. Для форматирования текста в Python обычно используют обратные слэши в сочетании с буквенным обозначением специальных символов. К примеру, с помощью \n можно вставить переход на новую строку прямо в f-строке.
phrace = ["Вышла", "новая", "версия", "Python"] print(f"{'\n'.join(phrace)}") >>> Вышла >>> новая >>> версия >>> Python
- Комментарии. В версии 3.12 можно использовать комментарии в f-строках, такие же, как в обычном коде. Это позволяет подробно описывать логику программы даже в тех местах, где Python раньше это запрещал.
device = { "type": "phone", "model": "iPhone 15 Pro", "price": 1500, "currency": "USD" } print(f"""Phone model: { device["model"] # Тут может быть комментарий }""") >>> Phone model: iPhone 15 Pro
Улучшенные сообщения об ошибках
Разработчики Python начали модифицировать сообщения об ошибках еще в версии 3.10 и продолжили дело в 3.12. Теперь пришла очередь ошибок, которые видит пользователь при неправильном подключении библиотек и сторонних модулей. Python не просто подсветит неправильную строку, но и выведет подробную рекомендацию по исправлению. Все это работает только со стандартной библиотекой. Рассмотрим примеры на модуле pi библиотеки math.
Если указать неправильное имя модуля, то Python выведет ImportError с предложением заменить нераспознанное название на что-то максимально подходящее из списка библиотеки.
ImportError: cannot import name 'py' from 'math'. Did you mean: 'pi'?
При вызове необъявленной библиотеки Python спросит, не забыли ли вы подключить ее. При этом в терминале появится ошибка типа NameError.
NameError: name 'math' is not defined. Did you forget to import 'math'?
Если во время импорта поменять местами операторы from-import, то Python не просто подсветит ошибку, а подскажет, что именно произошло и как это можно исправить.
SyntaxError: Did you mean to use 'from ... import ...' instead?
Оптимизация и ускорение
Команда проекта продолжает работать над оптимизацией Python. Выпуск 3.12 стал на 5% быстрее. Скорее всего, эта цифра не даст почувствовать очевидные изменения, но разработчики явно готовят кодовую базу к более значимому обновлению. Повысить скорость Python удалось благодаря следующему:
- Ускорили операции с регулярными выражениями в re.sub(), re.subn() и re.Pattern.
- Добавили поддержку бинарного оптимизатора BOLT (Binary Optimization and Layout Tool), что в зависимости от сценариев дает прирост производительности на 1–5%.
- Значительно сократили использование памяти: к примеру, если раньше заголовок объекта занимал 208 байт, то теперь — 96.
- Проверки isinstance() работают в 2–10 раз быстрее для различных протоколов.
- tokenize.tokenize() и tokenize.generate_tokens() увеличили скорость до 64%.
- Размер Unicode-элементов сократили на 8–16 байт.
- Ускорили процесс создания объектов класса asyncio.Task.
Прочие нововведения
В новую версию Python также внесли несколько небольших нововведений, упрощающих разработку:
- Интерпретатор теперь поддерживает Linux-ядро perf. Благодаря этому в процессе профилирования можно опознавать имена функций Python с помощью утилиты perf.
- Псевдонимы типов теперь можно определять с помощью выражения type.
- Добавили улучшенный синтаксис аннотации типов для обобщенных классов и функций.
- Модуль os теперь сопровождается расширенной поддержкой Windows.
- Методы os.listdrives(), os.listvolumes() и os.listmounts() теперь поддерживают Windows.
- Алгоритмы SHA1, SHA3, SHA2-384, SHA2-512 и MD5 в hashlib теперь используют формально верифицированные реализации от проекта HACL*.
- Модули uuid и sqlite3 снабдили интерфейсом командной строки: python -m sqlite3 и python -m uuid.
- Добавили поддержку подклассов в pathlib.Path.
- Изменили внутреннюю реализацию целых чисел. Это сделали для подготовки к следующим обновлениям.
Что удалили?
Не обошлось и без удаления неактуальных методов и функций языка. Разработчики регулярно исключают из Python устаревшие элементы, которые невозможно или небезопасно использовать. В версии 3.12 убрали следующее:
- Устаревшие функции в модуле unittest.
- Модули asynchat, asyncore, smtpd, imp и distutils.
- Неправильно работающие классы и функции hashlib.pbkdf2_hmac(), ssl.RAND_pseudo_bytes(), gzip.GzipFile, io.OpenWrapper, ElementTree.Element.copy().