为什么str.ends不允许“suffix”参数成为列表?

时间:2014-01-25 15:36:55

标签: python string typeerror

我看到str.endswith方法允许suffix参数为 字符串元组

Docstring:
S.endswith(suffix[, start[, end]]) -> bool
Return True if S ends with the specified suffix, False otherwise.
With optional start, test S beginning at that position.
With optional end, stop comparing S at that position.
suffix can also be a tuple of strings to try.

所以我猜它还接受 字符串列表 或其他一些 iterables ,但是当我尝试过,传递一个列表会引发错误:

In [300]: s='aaa'
In [301]: s.endswith(('a', 'b'))
Out[301]: True
In [302]: s.endswith(['a', 'b'])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-302-d70816089fed> in <module>()
----> 1 s.endswith(['a', 'b'])
TypeError: endswith first arg must be str, unicode, or tuple, not list

那么为什么它只接受 字符串元组

3 个答案:

答案 0 :(得分:3)

由于历史原因,可能str.startswithstr.endswith仅接受tuples而不接受listsisinstance自12月21日以来的工作方式相同,2001年(Python 2.2发布的那一天)。

以下是startswith / endwith feature request的摘录:

  

例外可以指定元组类型的方式相同   和 isinstance 可以使用类型的元组,str.startswith和endswith   可以采用可能的前缀/后缀的元组

答案 1 :(得分:3)

答案 2 :(得分:2)

API简单地回应isinstance()except (Exception1, Exception2)语法,它们也只接受元组。

请参阅original feature request

  

异常可以指定类型的元组,并且isinstance可以采用类型元组,str.startswith和endswith可以采用可能的前缀/后缀元组。

没有理由代码不能支持任意的非字符串迭代(产生字符串)。如果您对此有强烈的感觉,可以在Python issue tracker中提交功能请求。但是,知道Guido van Rossum已经stated that they are not interested in changing this

  

总而言之,我希望你会放弃对这个功能的推动。它只是   看起来并不那么重要,你真的只是移动了   不一致的地方(特殊套管字符串而不是   元组)。