Новые фичи Python 3.8

14 Октября 2019 года вышла новая версия языка Python под номером 3.8, содержащая множество мелких улучшений и оптимизаций, которые делают новую версию быстрее чем ее предшественники.  Эта заметка охватывает наиболее интересные изменения в языке.

Новый оператор “Морж” (Walrus)

Начиная с версии 3.8 вводится новый оператор присваивания, который позволяет одновременно с присваиванием вернуть присваиваемое значение, с новым синтаксисом :=.

Например:

Начиная с версии 3.8, данный код можно переписать так:

Такой оператор позволяет одновременно присвоить значение переменной и сразу же вернуть его для использования. При этом оператор не делает ничего, такого-что бы было не возможно без него.

Более наглядно и эффективно оператор, можно применить в следующем примере, в котором требуется обновлять переменную в цикле и принимать решение о продолжении цикла или нет:

Однако применение нового оператора может упростить код:

Хотя новый вариант и короче, но вместе с тем и этот вариант не лишен недостатков, он тяжелее в понимании. Документ PEP 572 описывает все детали новых выражений присваивания, включая и некоторые обоснования для их введения в язык, а также несколько примеров того, как можно использовать этот оператор.

Только позиционные аргументы

Рассмотрим интересную особенность языка, если мы посмотрим, на стандартную функцию float:

При этом в описании функции вы увидите странный слэш “/” в конце параметров, который означает, что для данной функции можно использовать только позиционные параметры, но нельзя применить именованные. При попытке выполнить функцию с именованными параметрами мы получим следующую ошибку:

Однако такое поведение до версии 3.8 имеется только у встроенных функций и нет никакого механизма, применить такой подход для своих функций. До версии 3.8 следующий код всегда имеет такое поведение:

Конечно можно переписать код с использованием *args и смоделировать схожее поведение, однако при этом теряется вся гибкость и удобство чтения кода, а также требуются дополнительные усилия. Но с новой версией языка, можно переписать код, что бы он принимал только позиционные параметры:

В этом случае после параметра “х” идет символ клэш “/”, который означает, что все параметры до него могут передаваться только через позиционные аргументы. При этом стоит отметить, что все параметры после слэша могут передаваться как через именованные параметры так и через позиционные.

На первый взгляд, такие позиционные аргументы могут показаться идущими в разрез с духом Python, а кроме того не так много случаев, когда позиционные аргументы улучшат код.

Однако в некоторых случаях такие аргументы могут быть весьма полезны. Во-первых, позиционные аргументы имеют смысл, когда у вас есть аргументы, которые имеют естественный порядок, но для них трудно придумать хорошие имена.

Другое возможное преимущество использования позиционных аргументов состоит в том, что вы можете легче реорганизовать свои функции. В частности, вы можете изменить имя ваших параметров, не беспокоясь о том, что другой код зависит от этих имен.

Только позиционные аргументы хорошо дополняют аргументы только которые передаются только через ключевые слова. В любой версии Python 3 вы можете указать аргументы только для ключевых слов, используя звездочку (*). Любой аргумент после * должен быть указан с помощью передачи через ключевые слова, так в примере параметр celsium должен быть передан только через ключевое слово и другие варианты всегда будет приводить к ошибке:

Вы можете комбинировать позиционные, обычные и ключевые параметры, указав их в в определенном порядке через / и *. В следующем примере text является позиционным аргументом, border является обычным аргументом со значением по умолчанию, а width является ключевым аргументом со значением по умолчанию:

Более точные типы

Более точные типы
На данный момент система ввода Python достаточно развита. Однако в Python 3.8 были добавлены некоторые новые функции для набора текста, чтобы обеспечить более точную печать:

  • Литеральные типы (Literal types)
  • Типовые словари (Typed dictionaries)
  • Конечные объекты (Final objects)
  • протоколы (Protocols)

Python поддерживает необязательные подсказки типов, обычно в виде аннотаций в вашем коде, например:

Эта форма записи функции указывает, что функция должна принимать как параметр число с плавающей запятой и возвращать число с плавающей запятой, однако это только рекомендательное указание которое никак не влияет на работу функции и если ей на вход передать строку, то на выходе так же окажется строка без всяких ошибок:

https://realpython.com/python38-new-features/

Обсуждение закрыто.