This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2009年08月24日 21:33 by srid, last changed 2022年04月11日 14:56 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| issue6780.diff | ezio.melotti, 2010年03月14日 07:18 | patch for trunk | ||
| issue6780-2.diff | ezio.melotti, 2011年04月24日 01:57 | Patch against 2.7 | review | |
| Messages (9) | |||
|---|---|---|---|
| msg91942 - (view) | Author: Sridhar Ratnakumar (srid) | Date: 2009年08月24日 21:33 | |
The `startswith` method accepts both string and tuple (not list). Yet the error message suggests that it expects (only) a character buffer object. In Python-2.6: >>> "foo".startswith(['fo', 'df']) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: expected a character buffer object In Python-3.x, the error message is different: >>> "foo".startswith(["fo"]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Can't convert 'list' object to str implicitly Aside: why not try to convert 'list' object to tuple? |
|||
| msg91949 - (view) | Author: Ezio Melotti (ezio.melotti) * (Python committer) | Date: 2009年08月25日 09:23 | |
In the examples you used byte strings for Py2 and Unicode strings for Py3. On Py3 the same example with byte strings gives an error similar to the one raised by Py2: >>> b"foo".startswith([b"fo"]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: expected an object with the buffer interface (vs. Py2's expected a character buffer object) The error raised by Py2 with Unicode strings is more or less the same of Py3 too: >>> u"foo".startswith([u"fo", u"df"]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: coercing to Unicode: need string or buffer, list found (vs. Py3's Can't convert 'list' object to str implicitly) If I understood correctly the C code in /Objects/unicodeobject.c, this is because startswith checks if the 'prefix' is a tuple and, if not, it assumes that is a Unicode string. The 'prefix' is then converted to Unicode by PyUnicode_FromObject and if it's a list or some other object the error "Can't convert 'list' object to str implicitly" / "coercing to Unicode: need string or buffer, list found" is raised. I agree that a more explicit error message would be better, something like: "'prefix' must be a character buffer object or a tuple, not 'list'". > Aside: why not try to convert 'list' object to tuple? If the support for lists is added, it should probably be extended to all the iterables, but strings are iterables too, so that will create some problem. It could be checked if 'prefix' is a string and if not assume that is an iterable of strings, but I don't know if it's worth doing it. |
|||
| msg101042 - (view) | Author: Ezio Melotti (ezio.melotti) * (Python committer) | Date: 2010年03月14日 07:18 | |
Here is a proof of concept that solves the problem for unicode strings and startswith/endswith. If during the conversion to Unicode a TypeError is raised (e.g. TypeError: Can't convert 'list' object to str implicitly), the error message is changed to "TypeError: startswith first arg must be str, unicode, or tuple, not list". If the error is not a TypeError (e.g. a UnicodeDecodeError) the behavior is unchanged. I haven't tested the patch thoroughly, but if this approach is OK I will prepare a complete patch. |
|||
| msg123264 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2010年12月03日 16:48 | |
See also #10616. |
|||
| msg124317 - (view) | Author: R. David Murray (r.david.murray) * (Python committer) | Date: 2010年12月18日 20:42 | |
The approach looks good to me. I think this issue is orthogonal to #10616, since the message here needs to be modified anyway, regardless of what happens to the underlying issue. |
|||
| msg134321 - (view) | Author: Ezio Melotti (ezio.melotti) * (Python committer) | Date: 2011年04月24日 01:57 | |
Attached an updated patch for 2.7 with tests that check that UnicodeErrors are still raised and that the error message mentions 'str', 'unicode' and 'tuple'. |
|||
| msg134442 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2011年04月26日 03:45 | |
New changeset 3ceeccbc2c3b by Ezio Melotti in branch '2.7': #6780: fix starts/endswith error message to mention that tuples are accepted too. http://hg.python.org/cpython/rev/3ceeccbc2c3b New changeset bcbf8c3c4a88 by Ezio Melotti in branch '3.1': #6780: fix starts/endswith error message to mention that tuples are accepted too. http://hg.python.org/cpython/rev/bcbf8c3c4a88 New changeset f393c507717a by Ezio Melotti in branch '3.2': #6780: merge with 3.1. http://hg.python.org/cpython/rev/f393c507717a New changeset a1a1296556d7 by Ezio Melotti in branch 'default': #6780: merge with 3.2. http://hg.python.org/cpython/rev/a1a1296556d7 |
|||
| msg134546 - (view) | Author: Éric Araujo (eric.araujo) * (Python committer) | Date: 2011年04月27日 10:13 | |
I would have used with self.assertRaises to write the tests, thinking it would be less verbose/cumbersome. |
|||
| msg134547 - (view) | Author: Ezio Melotti (ezio.melotti) * (Python committer) | Date: 2011年04月27日 10:16 | |
In 3.1 I had to use try/except because cm.exception is new in 2.7/3.2. I used assertRaises on the other branches. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:56:52 | admin | set | github: 51029 |
| 2011年04月27日 10:16:11 | ezio.melotti | set | messages: + msg134547 |
| 2011年04月27日 10:13:16 | eric.araujo | set | nosy:
+ eric.araujo messages: + msg134546 |
| 2011年04月26日 03:46:41 | ezio.melotti | set | status: open -> closed resolution: fixed stage: patch review -> |
| 2011年04月26日 03:45:18 | python-dev | set | nosy:
+ python-dev messages: + msg134442 |
| 2011年04月25日 02:58:53 | santoso.wijaya | set | nosy:
+ santoso.wijaya |
| 2011年04月24日 14:16:36 | ezio.melotti | set | keywords:
+ needs review stage: needs patch -> patch review versions: + Python 3.3 |
| 2011年04月24日 01:57:57 | ezio.melotti | set | files:
+ issue6780-2.diff messages: + msg134321 |
| 2010年12月18日 20:42:53 | r.david.murray | set | nosy:
vstinner, ezio.melotti, r.david.murray, srid versions: - Python 2.6 |
| 2010年12月18日 20:42:27 | r.david.murray | set | nosy:
+ r.david.murray messages: + msg124317 |
| 2010年12月03日 16:48:52 | vstinner | set | nosy:
+ vstinner messages: + msg123264 |
| 2010年03月14日 07:18:45 | ezio.melotti | set | keywords:
+ patch files: + issue6780.diff messages: + msg101042 |
| 2010年02月27日 09:54:16 | ezio.melotti | set | assignee: ezio.melotti stage: needs patch versions: + Python 2.7, Python 3.2 |
| 2009年08月25日 09:23:30 | ezio.melotti | set | priority: normal nosy: + ezio.melotti messages: + msg91949 components: + Interpreter Core, - Library (Lib) |
| 2009年08月24日 21:33:11 | srid | create | |