Почему не join() автоматически преобразует свои аргументы в строки? Когда вы никогда не захотите, чтобы они были струнами?
У нас есть список:
myList = [1, "two"]
И хочу распечатать его, обычно я бы использовал что-то вроде:
"{0} and {1}".format(*myList)
Но вы также можете сделать:
" and ".join(myList)
Но, к сожалению:
>>> " and ".join(myList)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, int found
Почему он просто не автоматически конвертирует список, который он получает в строки?
Когда вам когда-нибудь не понадобится конвертировать их в строки? Есть ли крошечный кросс-код, который я пропускаю?
Ответы
Ответ 1
Из Zen of Python:
Явный лучше, чем неявный.
и
Ошибки никогда не должны проходить молча.
Преобразование в строки неявно может скрыть ошибки, и я действительно хотел бы знать, есть ли у меня разные типы где-то, которые должны были быть строками.
Если вы хотите явно преобразовать в строки, вы можете сделать это, используя map()
, например:
''.join(map(str, myList))
Ответ 2
Проблема с попыткой выполнить что-то вроде x = 4 + "8"
, как написано, заключается в том, что предполагаемое значение неоднозначно. Должно ли x
содержать "48"
(неявное преобразование 4
в str
) или 12
(неявное преобразование "8"
в int
)? Мы не можем оправдать результат.
Чтобы избежать этой путаницы, Python требует явного преобразования одного из операндов:
>>> x = str(4) + "8"
>>> y = 4 + int("8")
>>> print x
48
>>> print y
12
Ответ 3
Использование правильного типа является частью программирования в Python. Общий встроенный, как print
, выполняет преобразование (если класс поддерживает __str__
), где вы должны это делать:
Пусть print
выполните работу:
print(*myList, sep = " and ")
Что для Python 3, если вы все еще находитесь на Python 2, используйте:
from __future__ import print_function