summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/pprint.rst40
-rw-r--r--Lib/pprint.py5
-rw-r--r--Lib/test/test_pprint.py8
-rw-r--r--Misc/NEWS.d/next/Library/2021-06-20-14-03-18.bpo-41546.lO1jXU.rst1
4 files changed, 26 insertions, 28 deletions
diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst
index 8f37450..3da5aa9 100644
--- a/Doc/library/pprint.rst
+++ b/Doc/library/pprint.rst
@@ -46,6 +46,8 @@ The :mod:`pprint` module defines one class:
*stream* (default ``sys.stdout``) is a :term:`file-like object` to
which the output will be written by calling its :meth:`write` method.
+ If both *stream* and ``sys.stdout`` are ``None``, then
+ :meth:`~PrettyPrinter.pprint` silently returns.
Other values configure the manner in which nesting of complex data
structures is displayed.
@@ -84,6 +86,9 @@ The :mod:`pprint` module defines one class:
.. versionchanged:: 3.10
Added the *underscore_numbers* parameter.
+ .. versionchanged:: 3.11
+ No longer attempts to write to ``sys.stdout`` if it is ``None``.
+
>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
>>> stuff.insert(0, stuff[:])
@@ -107,24 +112,13 @@ The :mod:`pprint` module defines one class:
>>> pp.pprint(tup)
('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))
-
-The :mod:`pprint` module also provides several shortcut functions:
-
.. function:: pformat(object, indent=1, width=80, depth=None, *, \
compact=False, sort_dicts=True, underscore_numbers=False)
Return the formatted representation of *object* as a string. *indent*,
- *width*, *depth*, *compact*, *sort_dicts* and *underscore_numbers* will be passed to the
- :class:`PrettyPrinter` constructor as formatting parameters.
-
- .. versionchanged:: 3.4
- Added the *compact* parameter.
-
- .. versionchanged:: 3.8
- Added the *sort_dicts* parameter.
-
- .. versionchanged:: 3.10
- Added the *underscore_numbers* parameter.
+ *width*, *depth*, *compact*, *sort_dicts* and *underscore_numbers* are
+ passed to the :class:`PrettyPrinter` constructor as formatting parameters
+ and their meanings are as described in its documentation above.
.. function:: pp(object, *args, sort_dicts=False, **kwargs)
@@ -142,20 +136,15 @@ The :mod:`pprint` module also provides several shortcut functions:
compact=False, sort_dicts=True, underscore_numbers=False)
Prints the formatted representation of *object* on *stream*, followed by a
- newline. If *stream* is ``None``, ``sys.stdout`` is used. This may be used
+ newline. If *stream* is ``None``, ``sys.stdout`` is used. This may be used
in the interactive interpreter instead of the :func:`print` function for
inspecting values (you can even reassign ``print = pprint.pprint`` for use
- within a scope). *indent*, *width*, *depth*, *compact*, *sort_dicts* and *underscore_numbers* will
- be passed to the :class:`PrettyPrinter` constructor as formatting parameters.
-
- .. versionchanged:: 3.4
- Added the *compact* parameter.
-
- .. versionchanged:: 3.8
- Added the *sort_dicts* parameter.
+ within a scope).
- .. versionchanged:: 3.10
- Added the *underscore_numbers* parameter.
+ The configuration parameters *stream*, *indent*, *width*, *depth*,
+ *compact*, *sort_dicts* and *underscore_numbers* are passed to the
+ :class:`PrettyPrinter` constructor and their meanings are as
+ described in its documentation above.
>>> import pprint
>>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
@@ -168,7 +157,6 @@ The :mod:`pprint` module also provides several shortcut functions:
'knights',
'ni']
-
.. function:: isreadable(object)
.. index:: builtin: eval
diff --git a/Lib/pprint.py b/Lib/pprint.py
index 13819f3..60ce57e 100644
--- a/Lib/pprint.py
+++ b/Lib/pprint.py
@@ -148,8 +148,9 @@ class PrettyPrinter:
self._underscore_numbers = underscore_numbers
def pprint(self, object):
- self._format(object, self._stream, 0, 0, {}, 0)
- self._stream.write("\n")
+ if self._stream is not None:
+ self._format(object, self._stream, 0, 0, {}, 0)
+ self._stream.write("\n")
def pformat(self, object):
sio = _StringIO()
diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py
index 6c714fd..c7b9893 100644
--- a/Lib/test/test_pprint.py
+++ b/Lib/test/test_pprint.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import collections
+import contextlib
import dataclasses
import io
import itertools
@@ -159,6 +160,13 @@ class QueryTestCase(unittest.TestCase):
self.assertTrue(pp.isreadable(safe),
"expected isreadable for %r" % (safe,))
+ def test_stdout_is_None(self):
+ with contextlib.redirect_stdout(None):
+ # smoke test - there is no output to check
+ value = 'this should not fail'
+ pprint.pprint(value)
+ pprint.PrettyPrinter().pprint(value)
+
def test_knotted(self):
# Verify .isrecursive() and .isreadable() w/ recursion
# Tie a knot.
diff --git a/Misc/NEWS.d/next/Library/2021-06-20-14-03-18.bpo-41546.lO1jXU.rst b/Misc/NEWS.d/next/Library/2021-06-20-14-03-18.bpo-41546.lO1jXU.rst
new file mode 100644
index 0000000..050da76
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-06-20-14-03-18.bpo-41546.lO1jXU.rst
@@ -0,0 +1 @@
+Make :mod:`pprint` (like the builtin ``print``) not attempt to write to ``stdout`` when it is ``None``.