17db96d56Sopenharmony_ci:mod:`pprint` --- Data pretty printer
27db96d56Sopenharmony_ci=====================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: pprint
57db96d56Sopenharmony_ci   :synopsis: Data pretty printer.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. moduleauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
87db96d56Sopenharmony_ci.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci**Source code:** :source:`Lib/pprint.py`
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci--------------
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciThe :mod:`pprint` module provides a capability to "pretty-print" arbitrary
157db96d56Sopenharmony_ciPython data structures in a form which can be used as input to the interpreter.
167db96d56Sopenharmony_ciIf the formatted structures include objects which are not fundamental Python
177db96d56Sopenharmony_citypes, the representation may not be loadable.  This may be the case if objects
187db96d56Sopenharmony_cisuch as files, sockets or classes are included, as well as many other
197db96d56Sopenharmony_ciobjects which are not representable as Python literals.
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ciThe formatted representation keeps objects on a single line if it can, and
227db96d56Sopenharmony_cibreaks them onto multiple lines if they don't fit within the allowed width.
237db96d56Sopenharmony_ciConstruct :class:`PrettyPrinter` objects explicitly if you need to adjust the
247db96d56Sopenharmony_ciwidth constraint.
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ciDictionaries are sorted by key before the display is computed.
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci.. versionchanged:: 3.9
297db96d56Sopenharmony_ci   Added support for pretty-printing :class:`types.SimpleNamespace`.
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci.. versionchanged:: 3.10
327db96d56Sopenharmony_ci   Added support for pretty-printing :class:`dataclasses.dataclass`.
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ciThe :mod:`pprint` module defines one class:
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci.. First the implementation class:
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci.. index:: single: ...; placeholder
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci.. class:: PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, \
427db96d56Sopenharmony_ci                         compact=False, sort_dicts=True, underscore_numbers=False)
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci   Construct a :class:`PrettyPrinter` instance.  This constructor understands
457db96d56Sopenharmony_ci   several keyword parameters.
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci   *stream* (default ``sys.stdout``) is a :term:`file-like object` to
487db96d56Sopenharmony_ci   which the output will be written by calling its :meth:`write` method.
497db96d56Sopenharmony_ci   If both *stream* and ``sys.stdout`` are ``None``, then
507db96d56Sopenharmony_ci   :meth:`~PrettyPrinter.pprint` silently returns.
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci   Other values configure the manner in which nesting of complex data
537db96d56Sopenharmony_ci   structures is displayed.
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci   *indent* (default 1) specifies the amount of indentation added for
567db96d56Sopenharmony_ci   each nesting level.
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci   *depth* controls the number of nesting levels which may be printed; if
597db96d56Sopenharmony_ci   the data structure being printed is too deep, the next contained level
607db96d56Sopenharmony_ci   is replaced by ``...``.  By default, there is no constraint on the
617db96d56Sopenharmony_ci   depth of the objects being formatted.
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci   *width* (default 80) specifies the desired maximum number of characters per
647db96d56Sopenharmony_ci   line in the output. If a structure cannot be formatted within the width
657db96d56Sopenharmony_ci   constraint, a best effort will be made.
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci   *compact* impacts the way that long sequences (lists, tuples, sets, etc)
687db96d56Sopenharmony_ci   are formatted. If *compact* is false (the default) then each item of a
697db96d56Sopenharmony_ci   sequence will be formatted on a separate line.  If *compact* is true, as
707db96d56Sopenharmony_ci   many items as will fit within the *width* will be formatted on each output
717db96d56Sopenharmony_ci   line.
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci   If *sort_dicts* is true (the default), dictionaries will be formatted with
747db96d56Sopenharmony_ci   their keys sorted, otherwise they will display in insertion order.
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci   If *underscore_numbers* is true, integers will be formatted with the
777db96d56Sopenharmony_ci   ``_`` character for a thousands separator, otherwise underscores are not
787db96d56Sopenharmony_ci   displayed (the default).
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci   .. versionchanged:: 3.4
817db96d56Sopenharmony_ci      Added the *compact* parameter.
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci   .. versionchanged:: 3.8
847db96d56Sopenharmony_ci      Added the *sort_dicts* parameter.
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci   .. versionchanged:: 3.10
877db96d56Sopenharmony_ci      Added the *underscore_numbers* parameter.
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci   .. versionchanged:: 3.11
907db96d56Sopenharmony_ci      No longer attempts to write to ``sys.stdout`` if it is ``None``.
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci      >>> import pprint
937db96d56Sopenharmony_ci      >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
947db96d56Sopenharmony_ci      >>> stuff.insert(0, stuff[:])
957db96d56Sopenharmony_ci      >>> pp = pprint.PrettyPrinter(indent=4)
967db96d56Sopenharmony_ci      >>> pp.pprint(stuff)
977db96d56Sopenharmony_ci      [   ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],
987db96d56Sopenharmony_ci          'spam',
997db96d56Sopenharmony_ci          'eggs',
1007db96d56Sopenharmony_ci          'lumberjack',
1017db96d56Sopenharmony_ci          'knights',
1027db96d56Sopenharmony_ci          'ni']
1037db96d56Sopenharmony_ci      >>> pp = pprint.PrettyPrinter(width=41, compact=True)
1047db96d56Sopenharmony_ci      >>> pp.pprint(stuff)
1057db96d56Sopenharmony_ci      [['spam', 'eggs', 'lumberjack',
1067db96d56Sopenharmony_ci        'knights', 'ni'],
1077db96d56Sopenharmony_ci       'spam', 'eggs', 'lumberjack', 'knights',
1087db96d56Sopenharmony_ci       'ni']
1097db96d56Sopenharmony_ci      >>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',
1107db96d56Sopenharmony_ci      ... ('parrot', ('fresh fruit',))))))))
1117db96d56Sopenharmony_ci      >>> pp = pprint.PrettyPrinter(depth=6)
1127db96d56Sopenharmony_ci      >>> pp.pprint(tup)
1137db96d56Sopenharmony_ci      ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci.. function:: pformat(object, indent=1, width=80, depth=None, *, \
1167db96d56Sopenharmony_ci                      compact=False, sort_dicts=True, underscore_numbers=False)
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci   Return the formatted representation of *object* as a string.  *indent*,
1197db96d56Sopenharmony_ci   *width*, *depth*, *compact*, *sort_dicts* and *underscore_numbers* are
1207db96d56Sopenharmony_ci   passed to the :class:`PrettyPrinter` constructor as formatting parameters
1217db96d56Sopenharmony_ci   and their meanings are as described in its documentation above.
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci.. function:: pp(object, *args, sort_dicts=False, **kwargs)
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci   Prints the formatted representation of *object* followed by a newline.
1277db96d56Sopenharmony_ci   If *sort_dicts* is false (the default), dictionaries will be displayed with
1287db96d56Sopenharmony_ci   their keys in insertion order, otherwise the dict keys will be sorted.
1297db96d56Sopenharmony_ci   *args* and *kwargs* will be passed to :func:`pprint` as formatting
1307db96d56Sopenharmony_ci   parameters.
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci   .. versionadded:: 3.8
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci.. function:: pprint(object, stream=None, indent=1, width=80, depth=None, *, \
1367db96d56Sopenharmony_ci                     compact=False, sort_dicts=True, underscore_numbers=False)
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci   Prints the formatted representation of *object* on *stream*, followed by a
1397db96d56Sopenharmony_ci   newline.  If *stream* is ``None``, ``sys.stdout`` is used. This may be used
1407db96d56Sopenharmony_ci   in the interactive interpreter instead of the :func:`print` function for
1417db96d56Sopenharmony_ci   inspecting values (you can even reassign ``print = pprint.pprint`` for use
1427db96d56Sopenharmony_ci   within a scope).
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci   The configuration parameters *stream*, *indent*, *width*, *depth*,
1457db96d56Sopenharmony_ci   *compact*, *sort_dicts* and *underscore_numbers* are passed to the
1467db96d56Sopenharmony_ci   :class:`PrettyPrinter` constructor and their meanings are as
1477db96d56Sopenharmony_ci   described in its documentation above.
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci      >>> import pprint
1507db96d56Sopenharmony_ci      >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
1517db96d56Sopenharmony_ci      >>> stuff.insert(0, stuff)
1527db96d56Sopenharmony_ci      >>> pprint.pprint(stuff)
1537db96d56Sopenharmony_ci      [<Recursion on list with id=...>,
1547db96d56Sopenharmony_ci       'spam',
1557db96d56Sopenharmony_ci       'eggs',
1567db96d56Sopenharmony_ci       'lumberjack',
1577db96d56Sopenharmony_ci       'knights',
1587db96d56Sopenharmony_ci       'ni']
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci.. function:: isreadable(object)
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci   .. index:: pair: built-in function; eval
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci   Determine if the formatted representation of *object* is "readable", or can be
1657db96d56Sopenharmony_ci   used to reconstruct the value using :func:`eval`.  This always returns ``False``
1667db96d56Sopenharmony_ci   for recursive objects.
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci      >>> pprint.isreadable(stuff)
1697db96d56Sopenharmony_ci      False
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci.. function:: isrecursive(object)
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci   Determine if *object* requires a recursive representation.
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ciOne more support function is also defined:
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci.. function:: saferepr(object)
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci   Return a string representation of *object*, protected against recursive data
1827db96d56Sopenharmony_ci   structures.  If the representation of *object* exposes a recursive entry, the
1837db96d56Sopenharmony_ci   recursive reference will be represented as ``<Recursion on typename with
1847db96d56Sopenharmony_ci   id=number>``.  The representation is not otherwise formatted.
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci   >>> pprint.saferepr(stuff)
1877db96d56Sopenharmony_ci   "[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci.. _prettyprinter-objects:
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ciPrettyPrinter Objects
1937db96d56Sopenharmony_ci---------------------
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ci:class:`PrettyPrinter` instances have the following methods:
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci.. method:: PrettyPrinter.pformat(object)
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci   Return the formatted representation of *object*.  This takes into account the
2017db96d56Sopenharmony_ci   options passed to the :class:`PrettyPrinter` constructor.
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci.. method:: PrettyPrinter.pprint(object)
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci   Print the formatted representation of *object* on the configured stream,
2077db96d56Sopenharmony_ci   followed by a newline.
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ciThe following methods provide the implementations for the corresponding
2107db96d56Sopenharmony_cifunctions of the same names.  Using these methods on an instance is slightly
2117db96d56Sopenharmony_cimore efficient since new :class:`PrettyPrinter` objects don't need to be
2127db96d56Sopenharmony_cicreated.
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci.. method:: PrettyPrinter.isreadable(object)
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci   .. index:: pair: built-in function; eval
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci   Determine if the formatted representation of the object is "readable," or can be
2207db96d56Sopenharmony_ci   used to reconstruct the value using :func:`eval`.  Note that this returns
2217db96d56Sopenharmony_ci   ``False`` for recursive objects.  If the *depth* parameter of the
2227db96d56Sopenharmony_ci   :class:`PrettyPrinter` is set and the object is deeper than allowed, this
2237db96d56Sopenharmony_ci   returns ``False``.
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci
2267db96d56Sopenharmony_ci.. method:: PrettyPrinter.isrecursive(object)
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci   Determine if the object requires a recursive representation.
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ciThis method is provided as a hook to allow subclasses to modify the way objects
2317db96d56Sopenharmony_ciare converted to strings.  The default implementation uses the internals of the
2327db96d56Sopenharmony_ci:func:`saferepr` implementation.
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci.. method:: PrettyPrinter.format(object, context, maxlevels, level)
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci   Returns three values: the formatted version of *object* as a string, a flag
2387db96d56Sopenharmony_ci   indicating whether the result is readable, and a flag indicating whether
2397db96d56Sopenharmony_ci   recursion was detected.  The first argument is the object to be presented.  The
2407db96d56Sopenharmony_ci   second is a dictionary which contains the :func:`id` of objects that are part of
2417db96d56Sopenharmony_ci   the current presentation context (direct and indirect containers for *object*
2427db96d56Sopenharmony_ci   that are affecting the presentation) as the keys; if an object needs to be
2437db96d56Sopenharmony_ci   presented which is already represented in *context*, the third return value
2447db96d56Sopenharmony_ci   should be ``True``.  Recursive calls to the :meth:`.format` method should add
2457db96d56Sopenharmony_ci   additional entries for containers to this dictionary.  The third argument,
2467db96d56Sopenharmony_ci   *maxlevels*, gives the requested limit to recursion; this will be ``0`` if there
2477db96d56Sopenharmony_ci   is no requested limit.  This argument should be passed unmodified to recursive
2487db96d56Sopenharmony_ci   calls. The fourth argument, *level*, gives the current level; recursive calls
2497db96d56Sopenharmony_ci   should be passed a value less than that of the current call.
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci.. _pprint-example:
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ciExample
2557db96d56Sopenharmony_ci-------
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ciTo demonstrate several uses of the :func:`pprint` function and its parameters,
2587db96d56Sopenharmony_cilet's fetch information about a project from `PyPI <https://pypi.org>`_::
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci   >>> import json
2617db96d56Sopenharmony_ci   >>> import pprint
2627db96d56Sopenharmony_ci   >>> from urllib.request import urlopen
2637db96d56Sopenharmony_ci   >>> with urlopen('https://pypi.org/pypi/sampleproject/json') as resp:
2647db96d56Sopenharmony_ci   ...     project_info = json.load(resp)['info']
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ciIn its basic form, :func:`pprint` shows the whole object::
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci   >>> pprint.pprint(project_info)
2697db96d56Sopenharmony_ci   {'author': 'The Python Packaging Authority',
2707db96d56Sopenharmony_ci    'author_email': 'pypa-dev@googlegroups.com',
2717db96d56Sopenharmony_ci    'bugtrack_url': None,
2727db96d56Sopenharmony_ci    'classifiers': ['Development Status :: 3 - Alpha',
2737db96d56Sopenharmony_ci                    'Intended Audience :: Developers',
2747db96d56Sopenharmony_ci                    'License :: OSI Approved :: MIT License',
2757db96d56Sopenharmony_ci                    'Programming Language :: Python :: 2',
2767db96d56Sopenharmony_ci                    'Programming Language :: Python :: 2.6',
2777db96d56Sopenharmony_ci                    'Programming Language :: Python :: 2.7',
2787db96d56Sopenharmony_ci                    'Programming Language :: Python :: 3',
2797db96d56Sopenharmony_ci                    'Programming Language :: Python :: 3.2',
2807db96d56Sopenharmony_ci                    'Programming Language :: Python :: 3.3',
2817db96d56Sopenharmony_ci                    'Programming Language :: Python :: 3.4',
2827db96d56Sopenharmony_ci                    'Topic :: Software Development :: Build Tools'],
2837db96d56Sopenharmony_ci    'description': 'A sample Python project\n'
2847db96d56Sopenharmony_ci                   '=======================\n'
2857db96d56Sopenharmony_ci                   '\n'
2867db96d56Sopenharmony_ci                   'This is the description file for the project.\n'
2877db96d56Sopenharmony_ci                   '\n'
2887db96d56Sopenharmony_ci                   'The file should use UTF-8 encoding and be written using '
2897db96d56Sopenharmony_ci                   'ReStructured Text. It\n'
2907db96d56Sopenharmony_ci                   'will be used to generate the project webpage on PyPI, and '
2917db96d56Sopenharmony_ci                   'should be written for\n'
2927db96d56Sopenharmony_ci                   'that purpose.\n'
2937db96d56Sopenharmony_ci                   '\n'
2947db96d56Sopenharmony_ci                   'Typical contents for this file would include an overview of '
2957db96d56Sopenharmony_ci                   'the project, basic\n'
2967db96d56Sopenharmony_ci                   'usage examples, etc. Generally, including the project '
2977db96d56Sopenharmony_ci                   'changelog in here is not\n'
2987db96d56Sopenharmony_ci                   'a good idea, although a simple "What\'s New" section for the '
2997db96d56Sopenharmony_ci                   'most recent version\n'
3007db96d56Sopenharmony_ci                   'may be appropriate.',
3017db96d56Sopenharmony_ci    'description_content_type': None,
3027db96d56Sopenharmony_ci    'docs_url': None,
3037db96d56Sopenharmony_ci    'download_url': 'UNKNOWN',
3047db96d56Sopenharmony_ci    'downloads': {'last_day': -1, 'last_month': -1, 'last_week': -1},
3057db96d56Sopenharmony_ci    'home_page': 'https://github.com/pypa/sampleproject',
3067db96d56Sopenharmony_ci    'keywords': 'sample setuptools development',
3077db96d56Sopenharmony_ci    'license': 'MIT',
3087db96d56Sopenharmony_ci    'maintainer': None,
3097db96d56Sopenharmony_ci    'maintainer_email': None,
3107db96d56Sopenharmony_ci    'name': 'sampleproject',
3117db96d56Sopenharmony_ci    'package_url': 'https://pypi.org/project/sampleproject/',
3127db96d56Sopenharmony_ci    'platform': 'UNKNOWN',
3137db96d56Sopenharmony_ci    'project_url': 'https://pypi.org/project/sampleproject/',
3147db96d56Sopenharmony_ci    'project_urls': {'Download': 'UNKNOWN',
3157db96d56Sopenharmony_ci                     'Homepage': 'https://github.com/pypa/sampleproject'},
3167db96d56Sopenharmony_ci    'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
3177db96d56Sopenharmony_ci    'requires_dist': None,
3187db96d56Sopenharmony_ci    'requires_python': None,
3197db96d56Sopenharmony_ci    'summary': 'A sample Python project',
3207db96d56Sopenharmony_ci    'version': '1.2.0'}
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ciThe result can be limited to a certain *depth* (ellipsis is used for deeper
3237db96d56Sopenharmony_cicontents)::
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_ci   >>> pprint.pprint(project_info, depth=1)
3267db96d56Sopenharmony_ci   {'author': 'The Python Packaging Authority',
3277db96d56Sopenharmony_ci    'author_email': 'pypa-dev@googlegroups.com',
3287db96d56Sopenharmony_ci    'bugtrack_url': None,
3297db96d56Sopenharmony_ci    'classifiers': [...],
3307db96d56Sopenharmony_ci    'description': 'A sample Python project\n'
3317db96d56Sopenharmony_ci                   '=======================\n'
3327db96d56Sopenharmony_ci                   '\n'
3337db96d56Sopenharmony_ci                   'This is the description file for the project.\n'
3347db96d56Sopenharmony_ci                   '\n'
3357db96d56Sopenharmony_ci                   'The file should use UTF-8 encoding and be written using '
3367db96d56Sopenharmony_ci                   'ReStructured Text. It\n'
3377db96d56Sopenharmony_ci                   'will be used to generate the project webpage on PyPI, and '
3387db96d56Sopenharmony_ci                   'should be written for\n'
3397db96d56Sopenharmony_ci                   'that purpose.\n'
3407db96d56Sopenharmony_ci                   '\n'
3417db96d56Sopenharmony_ci                   'Typical contents for this file would include an overview of '
3427db96d56Sopenharmony_ci                   'the project, basic\n'
3437db96d56Sopenharmony_ci                   'usage examples, etc. Generally, including the project '
3447db96d56Sopenharmony_ci                   'changelog in here is not\n'
3457db96d56Sopenharmony_ci                   'a good idea, although a simple "What\'s New" section for the '
3467db96d56Sopenharmony_ci                   'most recent version\n'
3477db96d56Sopenharmony_ci                   'may be appropriate.',
3487db96d56Sopenharmony_ci    'description_content_type': None,
3497db96d56Sopenharmony_ci    'docs_url': None,
3507db96d56Sopenharmony_ci    'download_url': 'UNKNOWN',
3517db96d56Sopenharmony_ci    'downloads': {...},
3527db96d56Sopenharmony_ci    'home_page': 'https://github.com/pypa/sampleproject',
3537db96d56Sopenharmony_ci    'keywords': 'sample setuptools development',
3547db96d56Sopenharmony_ci    'license': 'MIT',
3557db96d56Sopenharmony_ci    'maintainer': None,
3567db96d56Sopenharmony_ci    'maintainer_email': None,
3577db96d56Sopenharmony_ci    'name': 'sampleproject',
3587db96d56Sopenharmony_ci    'package_url': 'https://pypi.org/project/sampleproject/',
3597db96d56Sopenharmony_ci    'platform': 'UNKNOWN',
3607db96d56Sopenharmony_ci    'project_url': 'https://pypi.org/project/sampleproject/',
3617db96d56Sopenharmony_ci    'project_urls': {...},
3627db96d56Sopenharmony_ci    'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
3637db96d56Sopenharmony_ci    'requires_dist': None,
3647db96d56Sopenharmony_ci    'requires_python': None,
3657db96d56Sopenharmony_ci    'summary': 'A sample Python project',
3667db96d56Sopenharmony_ci    'version': '1.2.0'}
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ciAdditionally, maximum character *width* can be suggested. If a long object
3697db96d56Sopenharmony_cicannot be split, the specified width will be exceeded::
3707db96d56Sopenharmony_ci
3717db96d56Sopenharmony_ci   >>> pprint.pprint(project_info, depth=1, width=60)
3727db96d56Sopenharmony_ci   {'author': 'The Python Packaging Authority',
3737db96d56Sopenharmony_ci    'author_email': 'pypa-dev@googlegroups.com',
3747db96d56Sopenharmony_ci    'bugtrack_url': None,
3757db96d56Sopenharmony_ci    'classifiers': [...],
3767db96d56Sopenharmony_ci    'description': 'A sample Python project\n'
3777db96d56Sopenharmony_ci                   '=======================\n'
3787db96d56Sopenharmony_ci                   '\n'
3797db96d56Sopenharmony_ci                   'This is the description file for the '
3807db96d56Sopenharmony_ci                   'project.\n'
3817db96d56Sopenharmony_ci                   '\n'
3827db96d56Sopenharmony_ci                   'The file should use UTF-8 encoding and be '
3837db96d56Sopenharmony_ci                   'written using ReStructured Text. It\n'
3847db96d56Sopenharmony_ci                   'will be used to generate the project '
3857db96d56Sopenharmony_ci                   'webpage on PyPI, and should be written '
3867db96d56Sopenharmony_ci                   'for\n'
3877db96d56Sopenharmony_ci                   'that purpose.\n'
3887db96d56Sopenharmony_ci                   '\n'
3897db96d56Sopenharmony_ci                   'Typical contents for this file would '
3907db96d56Sopenharmony_ci                   'include an overview of the project, '
3917db96d56Sopenharmony_ci                   'basic\n'
3927db96d56Sopenharmony_ci                   'usage examples, etc. Generally, including '
3937db96d56Sopenharmony_ci                   'the project changelog in here is not\n'
3947db96d56Sopenharmony_ci                   'a good idea, although a simple "What\'s '
3957db96d56Sopenharmony_ci                   'New" section for the most recent version\n'
3967db96d56Sopenharmony_ci                   'may be appropriate.',
3977db96d56Sopenharmony_ci    'description_content_type': None,
3987db96d56Sopenharmony_ci    'docs_url': None,
3997db96d56Sopenharmony_ci    'download_url': 'UNKNOWN',
4007db96d56Sopenharmony_ci    'downloads': {...},
4017db96d56Sopenharmony_ci    'home_page': 'https://github.com/pypa/sampleproject',
4027db96d56Sopenharmony_ci    'keywords': 'sample setuptools development',
4037db96d56Sopenharmony_ci    'license': 'MIT',
4047db96d56Sopenharmony_ci    'maintainer': None,
4057db96d56Sopenharmony_ci    'maintainer_email': None,
4067db96d56Sopenharmony_ci    'name': 'sampleproject',
4077db96d56Sopenharmony_ci    'package_url': 'https://pypi.org/project/sampleproject/',
4087db96d56Sopenharmony_ci    'platform': 'UNKNOWN',
4097db96d56Sopenharmony_ci    'project_url': 'https://pypi.org/project/sampleproject/',
4107db96d56Sopenharmony_ci    'project_urls': {...},
4117db96d56Sopenharmony_ci    'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
4127db96d56Sopenharmony_ci    'requires_dist': None,
4137db96d56Sopenharmony_ci    'requires_python': None,
4147db96d56Sopenharmony_ci    'summary': 'A sample Python project',
4157db96d56Sopenharmony_ci    'version': '1.2.0'}
416