Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Вийшов Python 3.10. Що нового додали розробники

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Всім привіт, я пишу код на Python в ЛУН та веду подкаст про розробку «Потестим в проде». Вчора вийшов новий реліз Python 3.10, коротко розповім про основні фічі.

В мову додали match/case

В рамках PEP 634: Structural Pattern Matching в мову додали match/case конструкцію:

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

Працює звично: оператор match приймає вираз і послідовно порівнює його значення з шаблонами. Якщо шаблон не буде знайдений, буде виконаний опціональний останній стейтмент з wildcard _.

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

if isinstance(x, tuple) and len(x) == 2:
    host, port = x
    mode = "http"
elif isinstance(x, tuple) and len(x) == 3:
    host, port, mode = x
# Etc.

Такий код можна буде переписати за допомогою match:

match x:
    case host, port:
        mode = "http"
    case host, port, mode:
        pass
    # Etc.

Також можна буде реалізувати паттерн «guard». Якщо умова if не правдива, match перейде на наступний блок.

match point:
    case Point(x, y) if x == y:
        print(f"The point is located on the diagonal Y=X at {x}.")
    case Point(x, y):
        print(f"Point is not on the diagonal.")

Ось тут повний туторіал по match/case в Python.

Мультилайн контекст-менеджери

Стало можливим писати мультилайн контекст-менеджери, взявши їх в дужки:

with (
    CtxManager1() as example1,
    CtxManager2() as example2,
    CtxManager3() as example3,
):
    ...

Оптимізація str(), bytes() та bytearray()

Конструкції зробили швидше на 30-40% для маленьких об’єктів. Відповідний контріб’юшн ось тут.

Новий оператор для об’єднання типів

Представлено новий оператор для типів, що дозволяє синтаксис X | Y. Це зробить типізацію «Тип X чи тип Y» більш чистою, замість використання typing.Union.

Було:

def square(number: Union[int, float]) -> Union[int, float]:
    return number ** 2

Стало:

def square(number: int | float) -> int | float:
    return number ** 2

Також цей синтаксис можливо використовувати як аргумент isinstance() та issubclass():

>>> isinstance(1, int | str)
True

Визначення TypeAlias PEP 613

Тепер модуль typing має спеціальне значення TypeAlias, яке дозволяє більш чітко оголошувати alias для типів.

Було:

StrCache = 'Cache[str]'  # a type alias
LOG_PREFIX = 'LOG[DEBUG]'  # a module constant
 

Стало:

StrCache: TypeAlias = 'Cache[str]'  # a type alias
LOG_PREFIX = 'LOG[DEBUG]'  # a module constant

Також у розробників з’явилась можливість писати власні TypeGuard для перевірки типів.

Крім цього, покращили та деталізували логи при помилках:

  • При IndentationError буде надано більше контексту про блок і очікувану кількість відступів.
  • В разі AttributeErrors вам буде запропоновані можливі варіанти атрибутів даного об’єкта.
  • В разі SyntaxError показується більш повний контекст в багатьох випадках.

Повний список змін шукайте тут.

👍ПодобаєтьсяСподобалось14
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

А Pandas під 10 комусь вдалось завести?

пітон вже давно помийка, але тепер він стає гігантською помийкою...

Та ну, фіч у рази менше.

Угу.

Та ну, фіч у рази менше.

...и раз в 100 тормознутее...

Авжеж :(

хоча є чутки що десь у 3.11-3.12 буде якийсь JIT...
за поточним досвідом PyPy прискорює в 3 рази.
Якщо цей JIT ще буде сумісним з Cython і [C]FFI — це буде ще не бомба, але вже граната :))

тоді що (на певний час) прийде на його заміну?

Цікаво було б почути визначення помийки

Мультилайн контекст-менеджери

наскільки я розумію, вся зміна — це те, що їх тепер можна у декілька рядків писати?
бо в один рядок ця фіча була доступна ген-ген з версії 2.6 вроді

with open(in_file) as inp, open(out_file, 'w') as outp:

Саме так, функціонал не розширився.

Дякую! Тільки так і треба))

Підписатись на коментарі