在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?
[:]是一个用于复制序列的古老习语。.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
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |