python – str.startswith如何真正起作用?

我一直在玩startswith(),我发现了一些有趣的东西:

>>> tup = ('1', '2', '3')
>>> lis = ['1', '2', '3', '4']
>>> '1'.startswith(tup)
True
>>> '1'.startswith(lis)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: startswith first arg must be str or a tuple of str, not list

现在,错误是显而易见的,将列表转换为元组将正常工作,就像它在第一时间一样:

>>> '1'.startswith(tuple(lis))
True

现在,我的问题是:为什么第一个参数必须是str或str前缀的元组,而不是str前缀列表?

AFAIK,startswith()的Python代码可能如下所示:

def startswith(src, prefix):
    return src[:len(prefix)] == prefix

但这让我更加困惑,因为即使考虑到它,无论是列表还是元组,它仍然不应该有任何区别.我错过了什么?

解决方法:

技术上没有理由接受其他序列类型,没有. source code粗略地这样做:

if isinstance(prefix, tuple):
    for substring in prefix:
        if not isinstance(substring, str):
            raise TypeError(...)
        return tailmatch(...)
elif not isinstance(prefix, str):
    raise TypeError(...)
return tailmatch(...)

(其中tailmatch(...)是实际的匹配工作).

所以是的,任何迭代都可以为循环做.但是,所有其他字符串测试API(以及i​​sinstance()和issubclass())采用多个值也只接受元组,这告诉您作为API的用户,可以安全地假设值赢了“不要变异.你不能改变一个元组,但理论上该方法可以改变列表.

另请注意,您通常会测试固定数量的前缀或后缀或类(在isinstance()和issubclass()的情况下);该实现不适合大量元素.元组意味着您具有有限数量的元素,而列表可以是任意大的.

接下来,如果任何可迭代或序列类型是可接受的,那么这将包括字符串;单个字符串也是一个序列.那么单个字符串参数应该被视为单独的字符,还是单个前缀?

换句话说,自我文档的限制是序列不会被变异,与其他API一致,它带有有限数量的项目的含义来测试,并消除了关于如何单个字符串的歧义论证应该被对待.

请注意,这是在Python Ideas列表之前提出的;见this thread; Guido van Rossum的主要论点是你要么是单个字符串的特殊情况,要么是只接受一个元组.他选择后者,并没有看到需要改变这一点.

上一篇:python – 为同一个字典值创建可交换元组键的最佳方法是什么?


下一篇:python-将字符串元组转换为元组