#6780: fix starts/endswith error message to mention that tuples are accepted too.
This commit is contained in:
parent
a0895db2e1
commit
e3685f6b1b
|
@ -414,7 +414,18 @@ class StrTest(
|
||||||
self.assertEqual('Andr\202 x'.decode('ascii', 'replace'),
|
self.assertEqual('Andr\202 x'.decode('ascii', 'replace'),
|
||||||
'Andr\202 x'.decode(encoding='ascii', errors='replace'))
|
'Andr\202 x'.decode(encoding='ascii', errors='replace'))
|
||||||
|
|
||||||
|
def test_startswith_endswith_errors(self):
|
||||||
|
with self.assertRaises(UnicodeDecodeError):
|
||||||
|
'\xff'.startswith(u'x')
|
||||||
|
with self.assertRaises(UnicodeDecodeError):
|
||||||
|
'\xff'.endswith(u'x')
|
||||||
|
for meth in ('foo'.startswith, 'foo'.endswith):
|
||||||
|
with self.assertRaises(TypeError) as cm:
|
||||||
|
meth(['f'])
|
||||||
|
exc = str(cm.exception)
|
||||||
|
self.assertIn('unicode', exc)
|
||||||
|
self.assertIn('str', exc)
|
||||||
|
self.assertIn('tuple', exc)
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
test_support.run_unittest(StrTest)
|
test_support.run_unittest(StrTest)
|
||||||
|
|
|
@ -442,6 +442,17 @@ class UnicodeTest(
|
||||||
return u'\u1234'
|
return u'\u1234'
|
||||||
self.assertEqual('%s' % Wrapper(), u'\u1234')
|
self.assertEqual('%s' % Wrapper(), u'\u1234')
|
||||||
|
|
||||||
|
def test_startswith_endswith_errors(self):
|
||||||
|
for meth in (u'foo'.startswith, u'foo'.endswith):
|
||||||
|
with self.assertRaises(UnicodeDecodeError):
|
||||||
|
meth('\xff')
|
||||||
|
with self.assertRaises(TypeError) as cm:
|
||||||
|
meth(['f'])
|
||||||
|
exc = str(cm.exception)
|
||||||
|
self.assertIn('unicode', exc)
|
||||||
|
self.assertIn('str', exc)
|
||||||
|
self.assertIn('tuple', exc)
|
||||||
|
|
||||||
@test_support.run_with_locale('LC_ALL', 'de_DE', 'fr_FR')
|
@test_support.run_with_locale('LC_ALL', 'de_DE', 'fr_FR')
|
||||||
def test_format_float(self):
|
def test_format_float(self):
|
||||||
# should not format with a comma, but always with C locale
|
# should not format with a comma, but always with C locale
|
||||||
|
|
|
@ -9,6 +9,9 @@ What's New in Python 2.7.2?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #6780: fix starts/endswith error message to mention that tuples are
|
||||||
|
accepted too.
|
||||||
|
|
||||||
- Issue #5057: fix a bug in the peepholer that led to non-portable pyc files
|
- Issue #5057: fix a bug in the peepholer that led to non-portable pyc files
|
||||||
between narrow and wide builds while optimizing BINARY_SUBSCR on non-BMP
|
between narrow and wide builds while optimizing BINARY_SUBSCR on non-BMP
|
||||||
chars (e.g. u"\U00012345"[0]).
|
chars (e.g. u"\U00012345"[0]).
|
||||||
|
|
|
@ -2918,8 +2918,12 @@ string_startswith(PyStringObject *self, PyObject *args)
|
||||||
Py_RETURN_FALSE;
|
Py_RETURN_FALSE;
|
||||||
}
|
}
|
||||||
result = _string_tailmatch(self, subobj, start, end, -1);
|
result = _string_tailmatch(self, subobj, start, end, -1);
|
||||||
if (result == -1)
|
if (result == -1) {
|
||||||
|
if (PyErr_ExceptionMatches(PyExc_TypeError))
|
||||||
|
PyErr_Format(PyExc_TypeError, "startswith first arg must be str, "
|
||||||
|
"unicode, or tuple, not %s", Py_TYPE(subobj)->tp_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return PyBool_FromLong(result);
|
return PyBool_FromLong(result);
|
||||||
}
|
}
|
||||||
|
@ -2958,8 +2962,12 @@ string_endswith(PyStringObject *self, PyObject *args)
|
||||||
Py_RETURN_FALSE;
|
Py_RETURN_FALSE;
|
||||||
}
|
}
|
||||||
result = _string_tailmatch(self, subobj, start, end, +1);
|
result = _string_tailmatch(self, subobj, start, end, +1);
|
||||||
if (result == -1)
|
if (result == -1) {
|
||||||
|
if (PyErr_ExceptionMatches(PyExc_TypeError))
|
||||||
|
PyErr_Format(PyExc_TypeError, "endswith first arg must be str, "
|
||||||
|
"unicode, or tuple, not %s", Py_TYPE(subobj)->tp_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return PyBool_FromLong(result);
|
return PyBool_FromLong(result);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7666,8 +7666,12 @@ unicode_startswith(PyUnicodeObject *self,
|
||||||
Py_RETURN_FALSE;
|
Py_RETURN_FALSE;
|
||||||
}
|
}
|
||||||
substring = (PyUnicodeObject *)PyUnicode_FromObject(subobj);
|
substring = (PyUnicodeObject *)PyUnicode_FromObject(subobj);
|
||||||
if (substring == NULL)
|
if (substring == NULL) {
|
||||||
|
if (PyErr_ExceptionMatches(PyExc_TypeError))
|
||||||
|
PyErr_Format(PyExc_TypeError, "startswith first arg must be str, "
|
||||||
|
"unicode, or tuple, not %s", Py_TYPE(subobj)->tp_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
result = tailmatch(self, substring, start, end, -1);
|
result = tailmatch(self, substring, start, end, -1);
|
||||||
Py_DECREF(substring);
|
Py_DECREF(substring);
|
||||||
return PyBool_FromLong(result);
|
return PyBool_FromLong(result);
|
||||||
|
@ -7710,9 +7714,12 @@ unicode_endswith(PyUnicodeObject *self,
|
||||||
Py_RETURN_FALSE;
|
Py_RETURN_FALSE;
|
||||||
}
|
}
|
||||||
substring = (PyUnicodeObject *)PyUnicode_FromObject(subobj);
|
substring = (PyUnicodeObject *)PyUnicode_FromObject(subobj);
|
||||||
if (substring == NULL)
|
if (substring == NULL) {
|
||||||
|
if (PyErr_ExceptionMatches(PyExc_TypeError))
|
||||||
|
PyErr_Format(PyExc_TypeError, "endswith first arg must be str, "
|
||||||
|
"unicode, or tuple, not %s", Py_TYPE(subobj)->tp_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
result = tailmatch(self, substring, start, end, +1);
|
result = tailmatch(self, substring, start, end, +1);
|
||||||
Py_DECREF(substring);
|
Py_DECREF(substring);
|
||||||
return PyBool_FromLong(result);
|
return PyBool_FromLong(result);
|
||||||
|
|
Loading…
Reference in New Issue