python 为什么[:]包含在'. removeprofix()'定义中?

0sgqnhkj  于 2022-12-25  发布在  Python
关注(0)|答案(1)|浏览(160)

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

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

为什么最后一行写的是return self[:],而不仅仅是return self

deikduxw

deikduxw1#

[:]是一个old idiom for copying sequences,现在我们用习惯的.copy来表示列表;通常没有很好的理由去复制字符串,因为它们被认为是不可变的,所以str类没有提供这样的方法。此外,由于字符串的临时性,[:]may well return the same instance anyway
那么,为什么要像这样将其包含在代码中呢?
因为str可以被子类化,线索就在后面的文本中:
当参数是str子类的示例时,方法的行为应该像那些参数首先被强制为基本str对象一样,并且返回值应该总是基本str
假设我们有一个用户定义的子类:

class MyString(str):
    ...

注意当我们对一个示例进行切片复制时会发生什么:

>>> type(MyString('xyz')[:])
<class 'str'>

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

相关问题