Мова програмування 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 може приймати ключові аргументи імен і типів, які відповідають вмісту Movie
—name: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, щоб не пропустити жодну публікацію!