Оглавление
Сейчас в бета версии находится (3.9.0b3), а в будущем мы увидим полноценный релиз Python 3.9. Несколько нововведений просто невероятно классные, и будет потрясно увидить их в полноценном релизе.
Мы разберем следующие моменты:
- Оператор объединения словарей
- Типизация
- Два новых метода для строк
- Новый синтаксический анализатор
Давайте посмотрим на эти новшества и как их можно применять.
Объединение словарей
Одна из моих самых любимых особенностей с хорошим синтаксисом. Например, если у нас есть 2 словаря a и b которые нужно объединить, то теперь можно воспользоваться специальным оператором.
a = {1: 'a', 2: 'b', 3: 'c'} b = {4: 'd', 5: 'e'} c = a | b print(c) # {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
А также оператор обновления |= , что-бы обновлять существующий словарь:
a = {1: 'a', 2: 'b', 3: 'c'} b = {4: 'd', 5: 'e'} a |= b print(a) # {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
Если в двух разных словарях есть одинаковый ключ, то используйте | :
a = {1: 'a', 2: 'b', 3: 'c', 6: 'одинаковые ключи'} b = {4: 'd', 5: 'e', 6: 'но разные значения'} print(a | b) # {1: 'a', 2: 'b', 3: 'c', 6: 'но разные значения', 4: 'd', 5: 'e'}
Обновление словарей с генераторами
Другая интересная штука с оператором |= это возможность обновления словарей с генераторами у которых есть пара ключ-значение :
a = {'a': 'one', 'b': 'two'} b = ((i, i**2) for i in range(3)) a |= b print(a) # {'a': 'one', 'b': 'two', 0: 0, 1: 1, 2: 4}
При попытке провернуть такое действие с оператором | мы получим ошибку TypeError, так как оператор допускает только объединение с объектами типа dict
Типизация
Python - это динамически типизированый язык, то есть нам не обязательно указывать тип переменной. Такое поведение нормально, хотя иногда это может сбивать с толку. И вот внезапно питоновская гибкость превращается в ничто другое как в неудобство.
С версии 3.5 мы можем указывать типы переменным, но такой подход был несколько громоздким. Обновление же все меняет, взгляните на пример:
Без типизации(слева) с типизацией 3.9 (справа)
В функции add_int мы явно хотим складывать числа друг с другом (по какой-то загадочной и необъяснительной причине). Но наш редактор этого не знает, и это вполне нормально что-бы сложить две строчки с помощью оператора + — поэтому никаких замечаний от интерпретатора мы не видим.
А теперь мы можем указать тип int , который хотим ожидать в входе в функцию. И теперь интерпретатор будет немедленно сообщать об ошибке.
Еще мы можем указывать вложенные типы например:
Типизацию можно использовать везде — и все благодаря новому синтаксису, теперь он выглядит гораздо красивей.
Два новых метода для строк
Не настолько важное как другие вышеупомянутые нововведения, но все равно полезное в определенных ситуациях. Два новых строковых метода для удаления префикса и суффикса:
"Hello world".removeprefix("He") # "llo world" "Hello world".removesuffix("ld") # "Hello wor"
Новый синтаксический анализатор
Хоть это изменение нельзя никак просмотреть, но оно вполне может стать впоследствии одним из самых значительных для будущего развития Python'а
Python в данный момент использует преимущественно синтаксический анализатор LL(1), который считывает код сверху вниз и слева направо.
Сейчас я фактически не понимаю о том, как это работает - но я могу дать вам список нескольких проблем возникающим с этим методом:
Python содержит в себе не только синтаксический анализатор LL(1), по этой причине некоторые анализаторы работают в обход существующей системе, создавая определенные сложности.
LL(1) создает ограничение для синтаксиса Python'а (без возможности их обхода). Эта проблема подчеркивает, что следующий код не может быть выполнен с помощью
текующего синтаксического анализатора (вызывается SyntaxError):
with (open("a_really_long_foo") as foo, open("a_really_long_bar") as bar): pass
- LL(1) ломает лево-рекурсивный анализатор. Значит определенный рекуривный синтаксис может спровоцировать бесконечный цикл с древовидной структурой. Гвидо ван Россум, создатель Python'а, объясняет это здесь
Все эти факторы (а также те, которые я просто не способен описать) имеет передовое влияние на Python; они стопорят развитие языка.
Новый синтаксический аналазитор, основанный на технологии PEG , даст разработчикам больше гибкости для написания кода — что-то, что мы начнем замечать с версии 3.10 и выше.
Заключение
Это все что мы можем ожидать от новой версии 3.9. Если вы уже не терпите опробовать новый бета релиз — 3.9.0b3 — то можете установить его здесь