Последние возможности Python
Эта статья объясняет новейшие возможности Python.
Мы пошагово объясним примечательные возможности Python версий 3.12–3.13 с практической точки зрения «немедленно применимых» функций.
YouTube Video
Последние возможности Python
В последние годы Python развивается с акцентом не только на «простоту написания», но и на «надёжность, скорость и читаемость». Ниже мы рассмотрим примечательные функции версий Python 3.12–3.13.
Значительные улучшения сообщений об ошибках (Python 3.12)
В Python 3.12 ошибки теперь отображаются более наглядно и конкретно. Вы можете мгновенно определить место ошибки и значительно сократить время отладки.
1def calc_total(price, tax):
2 return price + price * tax
3
4result = calc_total(100, )- Отсутствующие аргументы показываются с указанием строки и позиции, поэтому вы не запутаетесь при поиске причины.
Практическое использование оператора 'match' (структурное сопоставление с образцом)
Оператор 'match' позволяет декларативно описывать сложные ветвления условий и различать структуры данных. Работа со словарями и вложенными структурами становится особенно более понятной.
1user = {"status": "active", "name": "Alice"}
2
3match user:
4 case {"status": "active", "name": name}:
5 print(f"Welcome back, {name}!")
6 case {"status": "inactive"}:
7 print("Please activate your account.")
8 case _:
9 print("Unknown user status.")- Поскольку можно одновременно выполнять разветвление условий и извлечение данных, необходимость во вложенных if отпадает.
Интуитивно понятное сопоставление образцов для работы с вложенными данными
Оператор 'match' эффективен при работе со структурированными данными, такими как JSON или ответы API.
1data = {"user": {"name": "Bob", "age": 25}}
2
3match data:
4 case {"user": {"name": name, "age": age}}:
5 print(f"{name} is {age} years old.")- Вы можете безопасно извлекать только необходимые элементы, снижая потребность в защитном коде.
Улучшенный вывод отладочной информации с помощью f-строк (нотация =/ Python 3.8 и выше, повышенная удобство)
С помощью f-строк теперь можно добавлять =, чтобы одновременно отображать и выражение, и его результат. Эта функция предназначена для отладки и очень полезна, когда нужно быстро проверить содержимое переменной.
1x = 10
2y = 20
3print(f"{x=}, {y=}, {x+y=}")- Поскольку имена переменных и их значения выводятся вместе, временная отладка через
print()становится более удобочитаемой. - Вы можете писать логирующий и проверяющий код более кратко и выразительно.
Упрощённые аннотации типов и алиасы 'type' (Python 3.12: новая синтаксис для alias типов)
В Python 3.12 был введён отдельный синтаксис для определения алиасов типов — оператор type. Это позволяет аннотациям типов быть не только дополнительной информацией, но и языковым элементом, ясно отражающим намерение в проектировании.
1type UserId = int
2type UserName = str
3
4def greet(user_id: UserId, name: UserName) -> str:
5 return f"Hello, {name} (id={user_id})"- Присваивая значения каким-либо типам, например
UserIdилиUserName, различия в ролях становятся очевиднее, даже если оба используют типintилиstr. - Определения типов становятся более лаконичными, снижая трудозатраты на понимание в ходе ревью и поддержки кода.
- Раньше алиасы типа, такие как
UserId = int, присваивались через равно, но операторtypeявно указывает, что это определение нового типа. Это особенно полезно для повышения читаемости проектных решений в средних и больших проектах.
Естественные аннотации типов с использованием встроенных типов (упрощённые обобщения с Python 3.9+)
С Python 3.9 можно использовать встроенные типы, такие как list или dict, напрямую как обобщённые типы.
Это позволяет писать интуитивно понятные аннотации типов, не импортируя типы из модуля typing.
1def sum_numbers(numbers: list[int]) -> int:
2 return sum(numbers)
3
4print(sum_numbers([1, 2, 3, 4]))- Аннотации типов выполняют роль не «ограничений», а «документации, поясняющей суть обработки».
Безопасное связывание методов с типом Self (Python 3.11 и выше)
С Python 3.11 можно указывать тип Self как возвращаемый для методов, возвращающих сам класс.
Это позволяет безопасно писать цепочки вызовов методов, не теряя информацию о типах.
1from typing import Self
2
3class Counter:
4 def __init__(self, value: int = 0) -> None:
5 self.value = value
6
7 def increment(self) -> Self:
8 self.value += 1
9 return self
10
11counter = Counter()
12counter.increment().increment()
13print(counter.value)- Даже для методов, возвращающих
self, правильный тип результата сохраняется. - IDE и средства проверки типов могут точно понимать цепочки методов.
Более наглядная работа со строками (removeprefix / removesuffix | Python 3.9 и выше)
Начиная с Python 3.9 добавлены методы str.removeprefix() и str.removesuffix() для безопасного удаления префиксов и суффиксов. С этими методами вы можете явно выразить намерение «удалить только начало или только конец» строки.
1filename = "report_2026.txt"
2
3clean_name = filename.removeprefix("report_")
4name_without_ext = clean_name.removesuffix(".txt")
5
6print(name_without_ext)- Указанная строка удаляется только если она находится в начале или конце, что предотвращает нежелательные замены.
- Такой подход обеспечивает лучшую читаемость и надёжность по сравнению с использованием
replace()или срезов. - Особенно при работе со «строками определённого формата», например с именами файлов или предобработкой URL, применение этих методов значительно снижает риск ошибок.
Надёжное сравнение строк для интернационализации (str.casefold() | поддержка Unicode)
str.casefold() в Python — это метод для регистронезависимого сравнения с учётом Unicode. В отличие от простых lower() или upper(), здесь происходит нормализация строки, включая языко-зависимую замену символов.
1text1 = "Stra\u00dfe"
2text2 = "strasse"
3
4print(text1)
5print(text2)
6
7print(f"Comparison Result: {text1.casefold() == text2.casefold()}")- Метод гарантирует корректную обработку языковых различий, например, между немецкими
ßиss. - Это важнейшая техника для приложений с многоязычной поддержкой или интернационализацией.
Стандартная поддержка TOML (tomllib | Python 3.11 и выше)
Почти в Python 3.11 в стандартную библиотеку добавлен модуль tomllib для чтения TOML-файлов конфигурации. Теперь управление конфигурацией может выполняться только средствами Python, без зависимости от сторонних библиотек.
1import tomllib
2
3with open("config.toml", "rb") as f:
4 config = tomllib.load(f)
5
6print(config["database"]["host"])
7
8# config.toml
9# title = "TOML Example"
10# [database]
11# host = "192.168.1.1"
12# ports = [ 8001, 8001, 8002 ]- Внешние пакеты, такие как
toml, больше не требуются, что упрощает список зависимостей. - Загрузка файлов конфигурации стандартизирована, что облегчает развертывание, эксплуатацию и работу с CI-средой.
Обработка исключений в эпоху параллельных вычислений (ExceptionGroup / except* | Python 3.11 и выше)
В Python 3.11 появился ExceptionGroup для одновременной обработки нескольких исключений и синтаксис except*, позволяющий безопасно обрабатывать их по ветвям. Это новая возможность для обработки «одновременных ошибок» в асинхронной или параллельной обработке.
1def process(values):
2 errors = []
3 for v in values:
4 if v < 0:
5 errors.append(ValueError(f"Negative value: {v}"))
6 if errors:
7 raise ExceptionGroup("Invalid values", errors)
8
9try:
10 process([1, -2, -3])
11except* ValueError as e:
12 print("Handled:", e)- Теперь можно выбрасывать и классифицировать несколько исключений за одну операцию.
- Это решает проблему асинхронной обработки, когда была видна только первая ошибка.
- В операциях, таких как
asyncio.gather()или параллельная пакетная обработка, возможны одновременные многочисленные ошибки. ИспользованиеExceptionGroupупрощает сбор ошибок, логирование и организацию повторных попыток.
Производительность повышается просто при обновлении до самой новой версии
С Python 3.11 многие процессы ускорились благодаря внутренним оптимизациям.
1def count_up(n):
2 total = 0
3 for i in range(n):
4 total += i
5 return total
6
7print(count_up(1_000_000))- Главное преимущество — можно повысить скорость работы без переписывания кода.
Контроль за сборкой мусора (явное управление через модуль gc)
В Python стандартный модуль gc позволяет временно отключать или вручную запускать сборку мусора. Это эффективный приём оптимизации при пакетной обработке больших данных либо в критичных по производительности задачах.
1import gc
2
3gc.disable()
4# heavy batch processing
5gc.enable()
6gc.collect()- Подавление ненужных запусков сборщика мусора снижает колебания времени обработки.
- Вы можете явно запускать сборку мусора по интервалам обработки, что упрощает контроль памяти.
- Тем не менее, этот приём не следует применять по умолчанию — используйте его только если профилирование показало, что сборщик мусора — узкое место. В большинстве случаев оптимально полагаться на автоматическую сборку мусора в Python.
Резюме
Благодаря повышению качества сообщений об ошибках и развитию аннотаций типов в Python 3.12–3.13, понимать и поддерживать код стало проще, чем когда-либо. Также улучшения — такие как новые средства отладки и повышение производительности за счёт внутренних оптимизаций — вносят прямой вклад в практическую продуктивность. Нет необходимости сразу использовать все новые возможности — достаточно начать с установки последней версии Python и постепенно внедрять необходимые функции по мере надобности. Постепенное внедрение улучшений делает код на Python более читаемым и надёжным.
Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.