Последние возможности Python

Последние возможности 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-канал.

YouTube Video