Наступил 2020 год, а значит, Python 2 перестал поддерживаться. Если быть совсем точным, то основные разработчики уже перестали заниматься веткой, а выход релиза 2.7.18, приуроченный к PyCon US в апреле 2020 года, ознаменует полное прекращение любой активности, связанной с Python 2.
С другой стороны, совсем недавно состоялся релиз Python 3.8, добавивший немного синтаксического сахара в язык. Python 3.9 же ожидается ещё нескоро, да и пока не похоже что добавит в язык что-то интересное.
Так что если вы вдруг ещё не отказались от Python 2, то дальше тянуть смысла просто нет: поддержка второй версии уже прекратилась, а переход сразу на 3.8 позволит использовать язык в его самом актуальном состоянии ещё долгое время.
Ну а, чтобы решиться было проще, ниже приведён обзор главных нововведений Python 3.8, которые пригодятся каждому пи��онисту.
1. Выражения присваивания (Assignment expressions)
Так же известные как «моржовый оператор» (walrus operator) — новый синтаксис, который позволит присваивать значения переменным внутри другого выражения. Это, наверное, самое известное и обсуждаемое из нововведений версии 3.8.
a = 6
# Код ниже присваивает b значение a ** 2
# и проверяет, если b > 0
if (b := a ** 2) > 0:
print(f'Квадрат {a} это {b}.') # Квадрат 6 это 36.Целью введения оператора является повышение читаемости кода, поэтому использовать его (как и все остальные операторы) стоит не при первой же возможности, а только тогда, когда это уместно.
# так делать НЕ НАДО
a = 5
d = [b := a+1, a := b-1, a := a*2]2. Только позиционные аргументы
Функции могут принимать два типа аргументов.
- Позиционные — передаваемые по позиции
- Именованные — передаваемые по имени
В коде ниже, значения обоих аргументов a и b можно передать как по позиции, так и по имени.
def my_func(a, b=1):
return a+b
my_func(5,2) # Оба аргумента позиционные
my_func(a=5, b=2) # Оба аргумента именованныеВ новой версии Питона можно явно ограничить, какие из параметров могут быть только позиционными или только именованными с помощью символов / и * в сигнатуре функции (последний, правда, появился ещё до Python 3.8).
В примере ниже, первые два параметра a и b только позиционные, c и d могут быть любыми, а последние два e и f должны быть именованными.
def my_func(a, b, /, c, d, *, e, f):
return a+b+c+d+e+f
my_func(1, 2, 3, 4, 5, 6) # ошибка: e, f должны быть именованными
my_func(a=1, b=2, 3, 4, e=5, f=6) # ошибка: a, b должны быть позиционными
my_func(1, 2, c=3, 4, e=5, f=6) # returns 21
my_unc(1, 2, c=3, d=4, e=5, f=6) # returns 21Зачем же ограничивать гибкость типов аргументов? В некоторых случаях использование имени параметра вместо его позиции будет бесполезным и неуместным. Ограничение так же позволит избежать проблем, если вы планируете изменить имена позиционных аргументов в будущем.
3. f-строки 2.0
Сложно описать словами, насколько проще и элегантнее сделали форматирование f-строки, появившиеся ещё в Python 3.6.
Сложно поверить, но Python 3.8 удалось сделать их ещё удобнее. Добавив знак = после имени подставляемой переменной, вы сможете вывести её имя и её значение без дублирования имени.
pi = 3 # В военное время может быть и так
print(f'pi={pi}') # так мы делали раньше
print(f'{pi=}') # а так можно делать теперьДебаг с помощью print станет ещё удобнее :)
4. Обратный порядок элементов словаря
Итерироваться по словарям теперь можно в обратном порядке с помощью reversed().
5. Получение метаданных из других модулей
Новый модуль importlib.metadata позволит получать метаданные (например, версию) из сторонних пакетов.
6. finally + continue
Раньше нельзя было использовать выражение continue внутри finally из-за сложности в реализации этой фичи. Теперь можно.
for i in range(2):
try:
print(i)
finally:
print('Тест.')
continue
print('Эту строку вы не увидите.')
# Python <= 3.7
>> SyntaxError: 'continue' not supported inside 'finally' clause
# Python 3.8
>> 0
Тест.
1
Тест.