#python
7 мая зафризили фичи
Python 3.15, и сейчас, в длинные выходные, самое время обсудить ключевые изменения.Сразу уточню, что полный стабильный релиз будет 1 октября, поэтому пока что катаемся на
test- и debug- ENV-ах 🤓.1. Lazy imports (PEP 810) 🥱
В язык завезли новое ключевое слово
lazy. Ленивый модуль загружается только при непосредственном обращении к его коду, что ускоряет старт Python-процесса:lazy import numpy as np
lazy from pandas import DataFrame
df = DataFrame() # только здесь pandas реально загрузится
Можно включить глобально через флаг
-X lazy_imports=all или переменную PYTHON_LAZY_IMPORTS.2. Распаковка в comprehensions (PEP 798) 📦
Самое долгожданное расширение синтаксиса за годы. Теперь
* и ** работают внутри list/set/dict-comprehensions и генераторов:lists = [[1, 2], [3, 4], [5]]
flat = [*L for L in lists] # [1, 2, 3, 4, 5]
merged = {**d for d in [{'a': 1}, {'b': 2}]} # {'a': 1, 'b': 2}
То, что раньше писалось через
itertools.chain.from_iterable или вложенные циклы, теперь - одна строка. Работает и в async for.Наконец вопрос на собесах «как разжать список списков» получил однозначный и окончательный ответ.
3. frozendict как builtin (PEP 814) 😎
«Замороженный» словарь - теперь встроенный тип. Можно класть в
set, использовать ключом другого dict, да ещё и хэш не зависит от порядка вставки!config = frozendict(host="localhost", port=5432)
cache = {config: "primary"}
hash(frozendict(a=1, b=2)) == hash(frozendict(b=2, a=1)) # True
Также его подружили с
copy, json, pickle, pprint.4. sentinel builtin (реализация PEP 661) 🛡
Все мы писали этот хак:
_MISSING = object(), чтобы отличать «не передал» от «передал None». Теперь это часть языка:MISSING = sentinel("MISSING")
def get(d, key, default=MISSING):
if default is MISSING:
raise KeyError(key)
return d.get(key, default)Мелочь, а приятно.
5. Tachyon - сэмплирующий профайлер (PEP 799) 🔎
Появился пакет
profiling с двумя бэкендами: profiling.tracing (бывший cProfile) и profiling.sampling - статистический профайлер с почти нулевым оверхедом. Самое крутое - сэмплирующий профайлер умеет подключаться к уже работающему процессу по его `PID`у:python -m profiling.sampling --pid 12345 --format flamegraph -o out.svg
Кто хоть раз профилировал прод - понимает цену вопроса.
6. Очередное ускорение 🚀
Ускорили
JIT (да, в CPython есть JIT, хоть и по умолчанию он недоступен!) на 8-9% на x86-64 Linux и на 12-13% на AArch64 macOS.Таким образом,
3.15 - это пусть и не «революционный», но важный релиз, значительно повышающий качество жизни разработчиков.Стандартная библиотека продолжает вбирать в себя то, что годами жило в формате рецептов на
Stack Overflow. Это ли не говорит о зрелости языка?С уважением,
Михаил Масягин
