为什么 [:] 包含在 `.removeprefix()` 定义中?

Phi*_*sey 4 python string

PEP-616中,规范removeprefix()包括以下代码块:

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

为什么最后一行说return self[:], 而不是 just return self

Kar*_*tel 7

[:]是一个用于复制序列的古老习语.copy如今,我们使用列表的惯用语;通常没有充分的理由来复制字符串,因为它们应该是不可变的,所以该类str不提供这样的方法。此外,由于字符串驻留,[:] 很可能无论如何都会返回相同的实例

那么,为什么要在这样的代码中包含它呢?

因为str可以子类化。线索就在后面的文字中:

当参数是str子类的实例时,方法的行为应该就像这些参数首先被强制转换为基str对象一样,并且返回值应该始终是基类str

假设我们有一个用户定义的子类:

class MyString(str):
    ...
Run Code Online (Sandbox Code Playgroud)

请注意当我们切片实例以复制它时会发生什么:

>>> type(MyString('xyz')[:])
<class 'str'>
Run Code Online (Sandbox Code Playgroud)

因此,在示例实现中,确保将返回符合文本规范[:]的基本类型的实例。str