Релиз нового пайтона уже не за горами и случится в октябре 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 …