Зміст
Зараз у бета-версії знаходиться (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 — то можете встановити його тут