---
26 июня 2020 г. 0:34

Новые возможности в Python 3.9

Оглавление

Сейчас в бета версии находится (3.9.0b3), а в будущем мы увидим полноценный релиз Python 3.9. Несколько нововведений просто невероятно классные, и будет потрясно увидить их в полноценном релизе.


Мы разберем следующие моменты:

  • Оператор объединения словарей
  • Типизация
  • Два новых метода для строк
  • Новый синтаксический анализатор

Давайте посмотрим на эти новшества и как их можно применять.

Объединение словарей

Одна из моих самых любимых особенностей с хорошим синтаксисом. Например, если у нас есть 2 словаря a и b которые нужно объединить, то теперь можно воспользоваться специальным оператором.

  1. a = {1: 'a', 2: 'b', 3: 'c'}
  2. b = {4: 'd', 5: 'e'}
  3.  
  4. c = a | b
  5. print(c) # {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

А также оператор обновления |= , что-бы обновлять существующий словарь:

  1. a = {1: 'a', 2: 'b', 3: 'c'}
  2. b = {4: 'd', 5: 'e'}
  3.  
  4. a |= b
  5.  
  6. print(a) # {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

Если в двух разных словарях есть одинаковый ключ, то используйте | :

  1. a = {1: 'a', 2: 'b', 3: 'c', 6: 'одинаковые ключи'}
  2. b = {4: 'd', 5: 'e', 6: 'но разные значения'}
  3.  
  4. print(a | b) # {1: 'a', 2: 'b', 3: 'c', 6: 'но разные значения', 4: 'd', 5: 'e'}

Обновление словарей с генераторами

Другая интересная штука с оператором |= это возможность обновления словарей с генераторами у которых есть пара ключ-значение :

  1. a = {'a': 'one', 'b': 'two'}
  2. b = ((i, i**2) for i in range(3))
  3.  
  4. a |= b
  5.  
  6. print(a) # {'a': 'one', 'b': 'two', 0: 0, 1: 1, 2: 4}

При попытке провернуть такое действие с оператором | мы получим ошибку TypeError, так как оператор допускает только объединение с объектами типа dict

Ошибка TypeError

Типизация

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

С версии 3.5 мы можем указывать типы переменным, но такой подход был несколько громоздким. Обновление же все меняет, взгляните на пример:

Пример использования типизации в 3.9 Без типизации(слева) с типизацией 3.9 (справа)

В функции add_int мы явно хотим складывать числа друг с другом (по какой-то загадочной и необъяснительной причине). Но наш редактор этого не знает, и это вполне нормально что-бы сложить две строчки с помощью оператора + — поэтому никаких замечаний от интерпретатора мы не видим.

А теперь мы можем указать тип int , который хотим ожидать в входе в функцию. И теперь интерпретатор будет немедленно сообщать об ошибке.

Еще мы можем указывать вложенные типы например:

Пример использование вложенных типов

Типизацию можно использовать везде — и все благодаря новому синтаксису, теперь он выглядит гораздо красивей.

Пример использование вложенных типов

Два новых метода для строк

Не настолько важное как другие вышеупомянутые нововведения, но все равно полезное в определенных ситуациях. Два новых строковых метода для удаления префикса и суффикса:

  1. "Hello world".removeprefix("He") # "llo world"
  2.  
  3. "Hello world".removesuffix("ld") # "Hello wor"

Новый синтаксический анализатор

Хоть это изменение нельзя никак просмотреть, но оно вполне может стать впоследствии одним из самых значительных для будущего развития Python'а

Python в данный момент использует преимущественно синтаксический анализатор LL(1), который считывает код сверху вниз и слева направо.

Сейчас я фактически не понимаю о том, как это работает - но я могу дать вам список нескольких проблем возникающим с этим методом:

  • Python содержит в себе не только синтаксический анализатор LL(1), по этой причине некоторые анализаторы работают в обход существующей системе, создавая определенные сложности.

  • LL(1) создает ограничение для синтаксиса Python'а (без возможности их обхода). Эта проблема подчеркивает, что следующий код не может быть выполнен с помощью
    текующего синтаксического анализатора (вызывается SyntaxError):

  1. with (open("a_really_long_foo") as foo,
  2. open("a_really_long_bar") as bar):
  3. pass
  • LL(1) ломает лево-рекурсивный анализатор. Значит определенный рекуривный синтаксис может спровоцировать бесконечный цикл с древовидной структурой. Гвидо ван Россум, создатель Python'а, объясняет это здесь

Все эти факторы (а также те, которые я просто не способен описать) имеет передовое влияние на Python; они стопорят развитие языка.

Новый синтаксический аналазитор, основанный на технологии PEG , даст разработчикам больше гибкости для написания кода — что-то, что мы начнем замечать с версии 3.10 и выше.

Заключение

Это все что мы можем ожидать от новой версии 3.9. Если вы уже не терпите опробовать новый бета релиз — 3.9.0b3 — то можете установить его здесь

По статье задано0вопрос(ов)

3

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

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