[issue17991] ctypes.c_char gives a misleading error when passed a one-character unicode string
Steven Barker added the comment: I was looking over some of the bugs I've contributed to, and it looks like this one has been fixed. It should be marked as a dupe of issue 22161 and closed (I can close, but not set a superseder, it seems). -- resolution: - duplicate status: open - closed ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue17991 ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue17991] ctypes.c_char gives a misleading error when passed a one-character unicode string
Changes by STINNER Victor victor.stin...@gmail.com: -- superseder: - Remove unsupported code from ctypes ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue17991 ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue17991] ctypes.c_char gives a misleading error when passed a one-character unicode string
Changes by STINNER Victor victor.stin...@gmail.com: -- nosy: +haypo ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue17991 ___ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue17991] ctypes.c_char gives a misleading error when passed a one-character unicode string
Shriramana Sharma added the comment: I came upon this too. In Python 2 it used to expect a one character string. Apparently the same error message has been carried forward to Python 3 too, though now the actual expected input is either a one character bytes type and not a str type, or an int corresponding to the ord() value of that char. Minimal demonstration: $ python Python 2.7.4 (default, Apr 19 2013, 18:28:01) [GCC 4.7.3] on linux2 Type help, copyright, credits or license for more information. from ctypes import * class test ( Structure ) : ... _fields_ = [ ( ch, c_char ) ] ... a = test() a.ch = ord('a') Traceback (most recent call last): File stdin, line 1, in module TypeError: one character string expected a.ch = 'c' a.ch 'c' $ python3 Python 3.3.1 (default, Apr 17 2013, 22:30:32) [GCC 4.7.3] on linux Type help, copyright, credits or license for more information. from ctypes import * class test ( Structure ) : ... _fields_ = [ ( ch, c_char ) ] ... a = test() a.ch = 'c' Traceback (most recent call last): File stdin, line 1, in module TypeError: one character string expected a.ch = b'c' a.ch b'c' a.ch = ord('c') a.ch b'c' -- nosy: +jamadagni ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue17991 ___ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue17991] ctypes.c_char gives a misleading error when passed a one-character unicode string
Changes by Terry J. Reedy tjre...@udel.edu: -- nosy: +amaury.forgeotdarc, meador.inge ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue17991 ___ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue17991] ctypes.c_char gives a misleading error when passed a one-character unicode string
New submission from Steven Barker: While investigating a Stack Overflow question (http://stackoverflow.com/questions/16484764/multiprocessing-value-clear-syntax) I came across a misleading error message from the multiprocessing.Value constructor: import multiprocessing my_char = x v = multiprocessing.Value(c, my_char) Traceback (most recent call last): File pyshell#21, line 1, in module v = multiprocessing.Value(c, my_char) File S:\Python33\lib\multiprocessing\__init__.py, line 243, in Value return Value(typecode_or_type, *args, lock=lock) File S:\Python33\lib\multiprocessing\sharedctypes.py, line 70, in Value obj = RawValue(typecode_or_type, *args) File S:\Python33\lib\multiprocessing\sharedctypes.py, line 47, in RawValue obj.__init__(*args) TypeError: one character string expected The one character string expected message was rather unhelpful, since that seemed to be what I gave it. After being stumped by this for a bit, I realized that it might be having an issue with Unicode and giving an error message more appropriate to Python 2 than Python 3. Sure enough, passing a one-character bytes instance works just fine. So, at a minimum I think the error message should be updated to say it wants a one-character bytes instance rather than a string (which to my mind means a str instance). A further enhancement might be to accept unicode strings that contain just a single ASCII character too, but I realize that may be more messy and error prone. The error message comes from the ctypes module, and can be reproduced easily: ctypes.c_char(x) Traceback (most recent call last): File pyshell#28, line 1, in module ctypes.c_char(x) TypeError: one character string expected The exception text comes from Modules/_ctypes/cfield.c:1151 -- components: Library (Lib) messages: 189338 nosy: Steven.Barker priority: normal severity: normal status: open title: ctypes.c_char gives a misleading error when passed a one-character unicode string type: enhancement versions: Python 3.3 ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue17991 ___ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue17991] ctypes.c_char gives a misleading error when passed a one-character unicode string
Changes by Steven Barker blckkn...@gmail.com: -- components: +ctypes -Library (Lib) ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue17991 ___ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com