diff options
-rw-r--r-- | Lib/ctypes/__init__.py | 5 | ||||
-rw-r--r-- | Lib/ctypes/test/test_python_api.py | 5 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/_ctypes/cfield.c | 2 |
4 files changed, 14 insertions, 1 deletions
diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 7690796..61923b6 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -135,6 +135,11 @@ from _ctypes import _SimpleCData class py_object(_SimpleCData): _type_ = "O" + def __repr__(self): + try: + return super(py_object, self).__repr__() + except ValueError: + return "%s(<NULL>)" % type(self).__name__ class c_short(_SimpleCData): _type_ = "h" diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py index 78e0231..9d13474 100644 --- a/Lib/ctypes/test/test_python_api.py +++ b/Lib/ctypes/test/test_python_api.py @@ -78,5 +78,10 @@ class PythonAPITestCase(unittest.TestCase): # not enough arguments self.failUnlessRaises(TypeError, PyOS_snprintf, buf) + def test_pyobject_repr(self): + self.failUnlessEqual(repr(py_object()), "py_object(<NULL>)") + self.failUnlessEqual(repr(py_object(42)), "py_object(42)") + self.failUnlessEqual(repr(py_object(object)), "py_object(%r)" % object) + if __name__ == "__main__": unittest.main() @@ -64,6 +64,9 @@ Core and builtins Library ------- +- The __repr__ method a NULL ctypes.py_object() does no longer raise + an exception. + - uuid.UUID now has a bytes_le attribute. This returns the UUID in little-endian byte order for Windows. In addition, uuid.py had some workarounds for clocks with low resolution, to stop the code yielding diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 62a5fe6..c16a387 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -1100,7 +1100,7 @@ O_get(void *ptr, unsigned size) if (!PyErr_Occurred()) /* Set an error if not yet set */ PyErr_SetString(PyExc_ValueError, - "PyObject is NULL?"); + "PyObject is NULL"); return NULL; } Py_INCREF(ob); |