Что нового в Python 3.9

June 11, 2020

Релиз нового пайтона уже не за горами и случится в октябре 2020. В этом посте я расскажу свои мысли про новые фичи.

Обсуждаем фишки нового пайтона

PEP 616 - String methods to remove prefixes and suffixes

В Python 3.9, PEP-616 добавили два новых метода для работы со строками:

  • str.removeprefix
  • str.removesuffix

Теперь вы можете реализовать функцию по тримингу кавычек в пару строк, ну ничоси:

def strip_quotes(text):
    return text.removeprefix('"').removesuffix('"')

А как раньше решалась такая задача?

def strip_quotes(text):
    return text.lstrip('"').rstrip('"')

Эммм... Да, тут есть небольшие нюансы, но все же, никто не отменял регулярные выражения:

import re

def strip_quotes(text): text = re.sub(r’^”’, ”, text) return re.sub(r’”$’, ”, text)

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

Но даже если бы не было этих методов, честно говоря, не знаю на сколько это оправдано вообще, так как засоряет стандартный API кучей мелких готовых функций (которые отчасти еще и дублируются), которые и так легко реализовать и подключать по требованию. Как бы мы могли реализовать эти функции (без lstrip, rstrip и регулярок)?

def removeprefix(s: str, prefix: str) -> str:
if s.startswith(prefix):
return s[len(prefix):]
return s

def removesuffix(s: str, suffix: str, /) -> str: if suffix and s.endswith(suffix): return s[:-len(suffix)] else: return s[:]

Так что эти фичи явно не big deal. Но… Объясните мне реальную нужду в таких вещах на уровне языка?

Пруф:

PEP 616 — String methods to remove prefixes and suffixes
The official home of the Python Programming Language

PEP585: Type Hinting Generics In Standard Collections

Это полезное улучшение. Любители типизаций должны оценить и мое личное мнение - в правильном направлении движется питон в плане тайп хинтингов. Если сейчас приходится писать так:

from typing import List, Type

lst: List[int] = [1, 2, 3]

t: Type[int] = float

То с версии 3.9 эти типы доступны в глобальном пространстве:

# From python 3.9

lst: list[int] = [1, 2, 3] t: type[int] = float

Приятная и полезная фича.

PEP 585 — Type Hinting Generics In Standard Collections
The official home of the Python Programming Language

PEP 584 - Add Union Operators To dict

В python на сегодня известно, по крайней мере, не менее 4х основных способа смерджить два словаря:

# 1. Simple merge:
merged = d1.copy()
merged.update(d2)

2. Unpacking merge:

merged = {**d1, **d2}

3. Unpacking again (keys must be strings):

merged = dict(d1, **d2)

4. collections.ChainMap. Result is not dict but so.

from collections import ChainMap merged: ChainMap = collections.ChainMap(d1, d2)

Теперь у нас будет пятый вариант для склеивания двух словарей:

merged = d1 | d2
PEP 584 — Add Union Operators To dict
The official home of the Python Programming Language

Мое отношение к этой фиче? Полезно, не сказать что это биг дил, но полезно.

В следующе статье попробую реализовать эту фичу на Python 3.8, заодно поглубже узнать возможности питона…

Используем фичи Python 3.9 в Python 3.8 - пишем полифил
Разбираемся как расширить built-in классыВ Python 3.9 заявлена новая фича: новый синтаксис мерджа двух и более словарей.Если раньше мы писали: # 1. Basic merge:merged = d1.copy()merged.update(d2) # 2. Unpacking merge:merged = {**d1, **d2} То в Python 3.9 можно будет писать так: merged = d1 …



Profile picture

Written by Alexander Mayorov
Full Stack CTO