Write object *obj* to file object *p*. The only supported flag for *flags* is
:c:macro:`Py_PRINT_RAW`; if given, the :func:`str` of the object is written
- instead of the :func:`repr`. Return ``0`` on success or ``-1`` on failure; the
- appropriate exception will be set.
+ instead of the :func:`repr`.
+
+ If *obj* is ``NULL``, write the string ``"<NULL>"``.
+ Return ``0`` on success or ``-1`` on failure; the
+ appropriate exception will be set.
.. c:function:: int PyFile_WriteString(const char *s, PyObject *p)
representation on success, ``NULL`` on failure. This is the equivalent of the
Python expression ``repr(o)``. Called by the :func:`repr` built-in function.
+ If argument is ``NULL``, return the string ``'<NULL>'``.
+
.. versionchanged:: 3.4
This function now includes a debug assertion to help ensure that it
does not silently discard an active exception.
a string similar to that returned by :c:func:`PyObject_Repr` in Python 2.
Called by the :func:`ascii` built-in function.
+ If argument is ``NULL``, return the string ``'<NULL>'``.
+
.. index:: string; PyObject_Str (C function)
Python expression ``str(o)``. Called by the :func:`str` built-in function
and, therefore, by the :func:`print` function.
+ If argument is ``NULL``, return the string ``'<NULL>'``.
+
.. versionchanged:: 3.4
This function now includes a debug assertion to help ensure that it
does not silently discard an active exception.
a TypeError is raised when *o* is an integer instead of a zero-initialized
bytes object.
+ If argument is ``NULL``, return the :class:`bytes` object ``b'<NULL>'``.
+
.. c:function:: int PyObject_IsSubclass(PyObject *derived, PyObject *cls)
# CRASHES list_extend(NULL, [])
# CRASHES list_extend([], NULL)
+ def test_uninitialized_list_repr(self):
+ lst = _testlimitedcapi.list_new(3)
+ self.assertEqual(repr(lst), '[<NULL>, <NULL>, <NULL>]')
+
if __name__ == "__main__":
unittest.main()
self.assertRaises(SystemError, resize, [1, 2, 3], 0, False)
self.assertRaises(SystemError, resize, NULL, 0, False)
+ def test_uninitialized_tuple_repr(self):
+ tup = _testlimitedcapi.tuple_new(3)
+ self.assertEqual(repr(tup), '(<NULL>, <NULL>, <NULL>)')
+
+
if __name__ == "__main__":
unittest.main()
--- /dev/null
+Fix :func:`repr` for lists containing ``NULL``\ s.
so must refetch the list size on each iteration. */
for (i = 0; i < Py_SIZE(v); ++i) {
/* Hold a strong reference since repr(item) can mutate the list */
- item = Py_NewRef(v->ob_item[i]);
+ item = Py_XNewRef(v->ob_item[i]);
if (i > 0) {
if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)