Вийшов 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()
Конструкції зробили швидше на
Новий оператор для об’єднання типів
Представлено новий оператор для типів, що дозволяє синтаксис 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 показується більш повний контекст в багатьох випадках.
Повний список змін шукайте тут.
17 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів