mirror of https://github.com/python/cpython
Patch # 1145 by Thomas Lee:
str.join(...) now applies str() to the sequence elements if they're not strings alraedy, except for bytes, which still raise TypeError (for the same reasons why ""==b"" raises it).
This commit is contained in:
parent
4e02c503e7
commit
f1044293fa
|
@ -789,8 +789,11 @@ functions based on regular expressions.
|
||||||
|
|
||||||
.. method:: str.join(seq)
|
.. method:: str.join(seq)
|
||||||
|
|
||||||
Return a string which is the concatenation of the strings in the sequence *seq*.
|
Return a string which is the concatenation of the values in the sequence
|
||||||
The separator between elements is the string providing this method.
|
*seq*. Non-string values in *seq* will be converted to a string using their
|
||||||
|
respective ``str()`` value. If there are any :class:`bytes` objects in
|
||||||
|
*seq*, a :exc:`TypeError` will be raised. The separator between elements is
|
||||||
|
the string providing this method.
|
||||||
|
|
||||||
|
|
||||||
.. method:: str.ljust(width[, fillchar])
|
.. method:: str.ljust(width[, fillchar])
|
||||||
|
|
|
@ -13,6 +13,7 @@ class Sequence:
|
||||||
|
|
||||||
class BadSeq1(Sequence):
|
class BadSeq1(Sequence):
|
||||||
def __init__(self): self.seq = [7, 'hello', 123]
|
def __init__(self): self.seq = [7, 'hello', 123]
|
||||||
|
def __str__(self): return '{0} {1} {2}'.format(*self.seq)
|
||||||
|
|
||||||
class BadSeq2(Sequence):
|
class BadSeq2(Sequence):
|
||||||
def __init__(self): self.seq = ['a', 'b', 'c']
|
def __init__(self): self.seq = ['a', 'b', 'c']
|
||||||
|
@ -987,19 +988,19 @@ class MixinStrUnicodeUserStringTest:
|
||||||
self.checkequal('abc', 'a', 'join', ('abc',))
|
self.checkequal('abc', 'a', 'join', ('abc',))
|
||||||
self.checkequal('z', 'a', 'join', UserList(['z']))
|
self.checkequal('z', 'a', 'join', UserList(['z']))
|
||||||
self.checkequal('a.b.c', '.', 'join', ['a', 'b', 'c'])
|
self.checkequal('a.b.c', '.', 'join', ['a', 'b', 'c'])
|
||||||
self.checkraises(TypeError, '.', 'join', ['a', 'b', 3])
|
self.checkequal('a.b.3', '.', 'join', ['a', 'b', 3])
|
||||||
for i in [5, 25, 125]:
|
for i in [5, 25, 125]:
|
||||||
self.checkequal(((('a' * i) + '-') * i)[:-1], '-', 'join',
|
self.checkequal(((('a' * i) + '-') * i)[:-1], '-', 'join',
|
||||||
['a' * i] * i)
|
['a' * i] * i)
|
||||||
self.checkequal(((('a' * i) + '-') * i)[:-1], '-', 'join',
|
self.checkequal(((('a' * i) + '-') * i)[:-1], '-', 'join',
|
||||||
('a' * i,) * i)
|
('a' * i,) * i)
|
||||||
|
|
||||||
self.checkraises(TypeError, ' ', 'join', BadSeq1())
|
self.checkequal(str(BadSeq1()), ' ', 'join', BadSeq1())
|
||||||
self.checkequal('a b c', ' ', 'join', BadSeq2())
|
self.checkequal('a b c', ' ', 'join', BadSeq2())
|
||||||
|
|
||||||
self.checkraises(TypeError, ' ', 'join')
|
self.checkraises(TypeError, ' ', 'join')
|
||||||
self.checkraises(TypeError, ' ', 'join', 7)
|
self.checkraises(TypeError, ' ', 'join', 7)
|
||||||
self.checkraises(TypeError, ' ', 'join', Sequence([7, 'hello', 123]))
|
self.checkraises(TypeError, ' ', 'join', [1, 2, bytes()])
|
||||||
try:
|
try:
|
||||||
def f():
|
def f():
|
||||||
yield 4 + ""
|
yield 4 + ""
|
||||||
|
|
|
@ -3238,10 +3238,6 @@ def strops():
|
||||||
except ValueError: pass
|
except ValueError: pass
|
||||||
else: raise TestFailed("''.split('') doesn't raise ValueError")
|
else: raise TestFailed("''.split('') doesn't raise ValueError")
|
||||||
|
|
||||||
try: ''.join([0])
|
|
||||||
except TypeError: pass
|
|
||||||
else: raise TestFailed("''.join([0]) doesn't raise TypeError")
|
|
||||||
|
|
||||||
try: ''.rindex('5')
|
try: ''.rindex('5')
|
||||||
except ValueError: pass
|
except ValueError: pass
|
||||||
else: raise TestFailed("''.rindex('5') doesn't raise ValueError")
|
else: raise TestFailed("''.rindex('5') doesn't raise ValueError")
|
||||||
|
|
|
@ -178,6 +178,10 @@ class UnicodeTest(
|
||||||
def test_join(self):
|
def test_join(self):
|
||||||
string_tests.MixinStrUnicodeUserStringTest.test_join(self)
|
string_tests.MixinStrUnicodeUserStringTest.test_join(self)
|
||||||
|
|
||||||
|
class MyWrapper:
|
||||||
|
def __init__(self, sval): self.sval = sval
|
||||||
|
def __str__(self): return self.sval
|
||||||
|
|
||||||
# mixed arguments
|
# mixed arguments
|
||||||
self.checkequalnofix('a b c d', ' ', 'join', ['a', 'b', 'c', 'd'])
|
self.checkequalnofix('a b c d', ' ', 'join', ['a', 'b', 'c', 'd'])
|
||||||
self.checkequalnofix('abcd', '', 'join', ('a', 'b', 'c', 'd'))
|
self.checkequalnofix('abcd', '', 'join', ('a', 'b', 'c', 'd'))
|
||||||
|
@ -186,6 +190,8 @@ class UnicodeTest(
|
||||||
self.checkequalnofix('a b c d', ' ', 'join', ['a', 'b', 'c', 'd'])
|
self.checkequalnofix('a b c d', ' ', 'join', ['a', 'b', 'c', 'd'])
|
||||||
self.checkequalnofix('abcd', '', 'join', ('a', 'b', 'c', 'd'))
|
self.checkequalnofix('abcd', '', 'join', ('a', 'b', 'c', 'd'))
|
||||||
self.checkequalnofix('w x y z', ' ', 'join', string_tests.Sequence('wxyz'))
|
self.checkequalnofix('w x y z', ' ', 'join', string_tests.Sequence('wxyz'))
|
||||||
|
self.checkequalnofix('1 2 foo', ' ', 'join', [1, 2, MyWrapper('foo')])
|
||||||
|
self.checkraises(TypeError, ' ', 'join', [1, 2, 3, bytes()])
|
||||||
|
|
||||||
def test_replace(self):
|
def test_replace(self):
|
||||||
string_tests.CommonTest.test_replace(self)
|
string_tests.CommonTest.test_replace(self)
|
||||||
|
|
|
@ -5412,14 +5412,20 @@ PyUnicode_Join(PyObject *separator, PyObject *seq)
|
||||||
|
|
||||||
item = PySequence_Fast_GET_ITEM(fseq, i);
|
item = PySequence_Fast_GET_ITEM(fseq, i);
|
||||||
/* Convert item to Unicode. */
|
/* Convert item to Unicode. */
|
||||||
if (! PyUnicode_Check(item) && ! PyString_Check(item)) {
|
if (!PyString_Check(item) && !PyUnicode_Check(item))
|
||||||
PyErr_Format(PyExc_TypeError,
|
{
|
||||||
"sequence item %zd: expected string or Unicode,"
|
if (PyBytes_Check(item))
|
||||||
" %.80s found",
|
{
|
||||||
i, Py_Type(item)->tp_name);
|
PyErr_Format(PyExc_TypeError,
|
||||||
goto onError;
|
"sequence item %d: join() will not operate on "
|
||||||
|
"bytes objects", i);
|
||||||
|
goto onError;
|
||||||
|
}
|
||||||
|
item = PyObject_Unicode(item);
|
||||||
}
|
}
|
||||||
item = PyUnicode_FromObject(item);
|
else
|
||||||
|
item = PyUnicode_FromObject(item);
|
||||||
|
|
||||||
if (item == NULL)
|
if (item == NULL)
|
||||||
goto onError;
|
goto onError;
|
||||||
/* We own a reference to item from here on. */
|
/* We own a reference to item from here on. */
|
||||||
|
|
Loading…
Reference in New Issue