Почему не 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