在PEP-616中,removeprefix()的规范包括以下代码块:
removeprefix()
def removeprefix(self: str, prefix: str, /) -> str: if self.startswith(prefix): return self[len(prefix):] else: return self[:]
为什么最后一行写的是return self[:],而不仅仅是return self?
return self[:]
return self
deikduxw1#
[:]是一个old idiom for copying sequences,现在我们用习惯的.copy来表示列表;通常没有很好的理由去复制字符串,因为它们被认为是不可变的,所以str类没有提供这样的方法。此外,由于字符串的临时性,[:]may well return the same instance anyway。那么,为什么要像这样将其包含在代码中呢?因为str可以被子类化,线索就在后面的文本中:当参数是str子类的示例时,方法的行为应该像那些参数首先被强制为基本str对象一样,并且返回值应该总是基本str。假设我们有一个用户定义的子类:
[:]
.copy
str
class MyString(str): ...
注意当我们对一个示例进行切片复制时会发生什么:
>>> type(MyString('xyz')[:]) <class 'str'>
因此,在示例实现中,[:]确保将返回基本str类型的示例,这符合文本规范。
1条答案
按热度按时间deikduxw1#
[:]
是一个old idiom for copying sequences,现在我们用习惯的.copy
来表示列表;通常没有很好的理由去复制字符串,因为它们被认为是不可变的,所以str
类没有提供这样的方法。此外,由于字符串的临时性,[:]
may well return the same instance anyway。那么,为什么要像这样将其包含在代码中呢?
因为
str
可以被子类化,线索就在后面的文本中:当参数是
str
子类的示例时,方法的行为应该像那些参数首先被强制为基本str
对象一样,并且返回值应该总是基本str
。假设我们有一个用户定义的子类:
注意当我们对一个示例进行切片复制时会发生什么:
因此,在示例实现中,
[:]
确保将返回基本str
类型的示例,这符合文本规范。