Why doesn't join() automatically convert its arguments to strings? When would you ever not want them to be strings?

旧街凉风 提交于 2020-01-14 07:32:08

问题


We have a list:

myList = [1, "two"]

And want to print it out, normally I would use something like:

"{0} and {1}".format(*myList)

But you could also do:

" and ".join(myList)

But unfortunately:

>>> " and ".join(myList)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, int found

Why doesn't it just automatically convert the list it receives to strings?

When would you ever not need it to convert them to strings? Is there some tiny edge case I'm missing?


回答1:


From the Zen of Python:

Explicit is better than implicit.

and

Errors should never pass silently.

Converting to strings implicitly can easily hide bugs, and I'd really want to know if I suddenly have different types somewhere that were meant to be strings.

If you want to explicitly convert to strings, you can do so using map(), for example:

''.join(map(str, myList))



回答2:


The problem with attempting to execute something like x = 4 + "8" as written is that the intended meaning is ambiguous. Should x contain "48" (implicitly converting 4 to str) or 12 (implicitly converting "8" to int)? We can't justify either result.

To avoid this confusion, Python requires explicit conversion of one of the operands:

>>> x = str(4) + "8"
>>> y = 4 + int("8")
>>> print x
48
>>> print y
12



回答3:


Using the correct type is part of programming in Python. A general built-in like print does do the conversion (if the class supports __str__), which is where you should be doing it:

Let print do the work:

print(*myList, sep = " and ")

That's for Python 3, if you are still on Python 2 then use:

from __future__ import print_function


来源:https://stackoverflow.com/questions/22152668/why-doesnt-join-automatically-convert-its-arguments-to-strings-when-would-yo

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!