2014-01-25 2 views
4

я вижу метод str.endswith позволяет suffix паров быть кортежем строк:Почему параметр strdend не позволяет параметру «суффикс» быть списком?

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. 

, так что я предполагаю, что это также принимает список строк или некоторые другие итерируемых, но когда я пробовал это, прохождение списка вызывает ошибку:

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 

Так почему же он принимает только Кортеж строк?

+2

Ну, это не может быть * any * iterable (с тем же значением), поскольку строки являются итерабельными и обрабатываются по-разному. – delnan

+0

@ delnan, ok, not * any *, но не является кортежами, подобными спискам при передаче в качестве параметров? – zhangxaochen

+0

@zhangxaochen Кортежи неизменяемы, они не могут быть изменены при передаче функции. Но список изменчив. –

ответ

2

API-интерфейс просто повторяет isinstance() и except (Exception1, Exception2) синтаксис, который, как только принимать кортежи, а также.

См. original feature request.

Нет причин, по которым код не может поддерживать произвольные, нестрочные итерации (придание строк). Вы можете подать запрос функции в Python issue tracker для этого, если вы решительно настроитесь на это.

+0

, есть ли причина, по которой 'isinstance' принимает кортеж, но не список? это также исторический, иначе? – zhangxaochen

+0

Извините, неверно прочитайте свой комментарий. Я просмотрел историю источников Python, и 'isinstance' поддерживает только кортежи для эонов. Я не вижу текущей причины не поддерживать список. Я бы сказал, что это исторический. –

3

Возможно str.startswith и str.endswith принимают только tuples и не принимают lists из-за исторических причин: isinstance работает так же, как с 21 декабря 2001 года (в день Python 2.2 был выпущен).

Вот выдержка из StartsWith/ENDWITH feature request:

In the same way that exceptions can have a tuple of types specified and isinstance can take a tuple of types, str.startswith and endswith could take a tuple of possible prefixes/suffixes.

Смежные вопросы