Почему str.removesuffix и str.removeprefix хотят сделать копию - PullRequest
1 голос
/ 28 апреля 2020

Глядя на str.removeprefix и str.removesuffix он говорит:

Если строка начинается / заканчивается строкой префикса / суффикса .. В противном случае возвращает копию исходной строки

И спецификация в PEP показывает Python эквивалентный код с возвратом копии в else:, а не возвращение только существующей ref:

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

def removesuffix(self: str, suffix: str, /) -> str:
    # suffix='' should not call self[:-0].
    if suffix and self.endswith(suffix):
        return self[:-len(suffix)]
    else:
        return self[:]

Мой вопрос, зачем вообще делать копию self[:]? Поскольку строки неизменяемы, не будет ли эффективнее просто вернуть оригинал?

1 Ответ

0 голосов
/ 29 апреля 2020

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

Вы можете проверить отсутствие копии с текущей альфа-сборкой Python 3.9 или чтение источника .

Обратите внимание, что версия этого метода для байтового массива действительно возвращает копию в случае отсутствия совпадения, поскольку байтовые массивы являются изменяемыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...