ProIT: медіа для профі в IT
3 хв

Найкращі нові функції та виправлення в Python 3.12

author avatar ProIT NEWS

Мова програмування Python випускає нові версії щороку. Щойно було випущено Python 3.12.

Розробникам пропонується випробувати цю останню версію на невиробничому коді, щоб перевірити, чи він працює з вашими програмами, й отримати уявлення про те, чи ваш код отримає користь від нових наборів функцій і покращень продуктивності у цій останній версії.

ProIT публікує короткий перелік найважливіших нових функцій у Python 3.12 і їхнє значення для розробників Python на основі матеріалу InfoWorld.

Кращі повідомлення про помилки

В останніх версіях Python повідомлення про помилки стають точнішими (точні позиції в рядках) й детальнішими (кращі пропозиції щодо того, що може бути не так).

Python 3.12 пропонує додаткові вдосконалення:

  • Пропозиції відсутніх модулів («Ви забули імпортувати X?») тепер включають модулі зі стандартної бібліотеки.
  • Кращі пропозиції щодо типових синтаксичних помилок під час імпорту. Наприклад, import p from m повертає помилку із запитом, чи мали ви на увазі from m import p.
  • Помилки імпорту для цього модуля тепер містять пропозиції з простору імен модуля, з якого імпортовані. Наприклад, якщо ви спробуєте from thismodule import thisclass, коли маєте на увазі ThisClass, то отримаєте пропозицію для ThisClass.
  • Пропозиції NameError тепер також включають self., що додається до назви, коли створюється в екземплярі класу (наприклад, name 'speed' is not defined. Did you mean 'self.speed'?). Це пояснюється тим, що пропуск змінних екземплярів self є поширеним джерелом помилок в екземплярах класу.

Менше обмежень на форматування f-рядків

F-рядки, зручна система Python для виконання форматування рядків, раніше були суттєво обмежені з точки зору способу їх форматування. Python 3.12 усуває багато з цих обмежень.

Зміни:

  • Вирази f-рядків тепер можуть бути будь-якими дійсними виразами Python.
  • Вирази f-рядка тепер можуть містити ті самі типи лапок, що й ті, які використовуються для виділення самого f-рядка. Наприклад, f"The shopping list, {", ".join(groceries)}" тепер є дійсним f-рядком.
  • F-рядкові вирази тепер можуть бути багаторядковими виразами, якщо вони відповідають тим самим правилам для інших багаторядкових виразів (наприклад, використання дужок, щоб дозволити виразам охоплювати кілька рядків).
  • Зворотні косі риски та визначення символів Unicode тепер дозволені в f-рядках. Ви можете використовувати все: від простих керівних символів (\n) до покликань на простір імен Unicode (\N{POUND SIGN}).
  • Помилки у виразах f-рядка тепер дають точне місце розташування помилки в охопному операторі, а не лише в самому виразі. Це полегшує пошук та усунення помилок f-рядка.

Підтримка профайлера продуктивності Linux

Популярний інструмент профайлера Linux perf працює з Python, але повертає лише інформацію про те, що відбувається на рівні C у середовищі виконання Python. Інформація про фактичні функції програми Python не відображається.

Python 3.12 увімкнув режим вибору, щоб дозволити perf збирати деталі про програми Python, а не лише про середовище виконання. Згоду можна зробити на рівні середовища або у програмі Python за допомогою функції sys.activate_stack_trampoline.

Покращення набору тексту

Синтаксис підказки типу Python, доданий у Python 3.5, дає змогу інструментам linting завчасно виявляти різноманітні помилки. З кожною новою версією введення тексту на Python отримує нові функції, які охоплюють ширший і детальніший діапазон випадків використання.

TypedDict

У Python 3.12 ви можете використовувати TypedDict як джерело типів для підказки ключових аргументів, що використовуються у функції. Для цього використовується variadic generic Unpack, представлений у версії 3.11.

Ось приклад із відповідного PEP:

class Movie(TypedDict):
    name: str
    year: int

def foo(**kwargs: Unpack[Movie]) -> None: ...

Тут foo може приймати ключові аргументи імен і типів, які відповідають вмісту Moviename:str і year:int.

Синтаксис параметра типу

Синтаксис параметра типу забезпечує чіткіший спосіб визначення типів у загальному класі, функції або псевдонімі типу.

Ось приклад із PEP:

# the old method 

from typing import TypeVar

_T = TypeVar("_T")

def func(a: _T, b: _T) -> _T:
    ...

# the new type parameter method

def func[T](a: T, b: T) -> T:
    ...

З новим методом не потрібно імпортувати TypeVar. Можна просто використовувати синтаксис func[T], щоб вказати покликання на загальний тип.

Також можна вказати межі типу. Наприклад, чи є цей тип одним із групи типів, хоча такі типи самі по собі не можуть бути загальними. Прикладом є func[T: (str,int)].

Підписуйтеся на ProIT у Telegram, щоб не пропустити жодну публікацію!

Приєднатися до company logo
Продовжуючи, ти погоджуєшся з умовами Публічної оферти та Політикою конфіденційності.