Displaying dictionary data in Sphinx documentation

This may not be the most elegant solution (it would be much better to write a proper directive to output a pretty-printed dictionary), but this works for now:

Add the custom exec directive given here to your Sphinx .conf file, then, in the .rst file you want to print the dictionary, do something like this:

.. exec::
    import json
    from some_module import some_dictionary
    json_obj = json.dumps(some_dictionary, sort_keys=True, indent=4)
    print '.. code-block:: JavaScript\n\n    %s\n\n' % json_obj

That will print out your dictionary in a JavaScript code block in your docs (which I find to be the best way to render dictionaries in the docs).


y'all i have done it but you are not going to believe me because it is literally five lines with imports. roast me in the replies but this has been working for a week or two and i haven't noticed it breaking anything.

This is in conf.py :

from pprint import pformat
def object_description(object) -> str:
    return pformat(object, indent=4)

from sphinx.util import inspect
inspect.object_description = object_description

this takes yer ~uh oh~

image of sphinx docs without pretty formatting

into a ~uh huh~

image of sphinx docs with pretty formatting

edit: fixed images b/c got the ~rep~ enough to have them


If dictionary value is not computed and human readable like this

FRUITS = {
   "Apple": "Red and Delicious",
   # note: eating too much orange make your hands orange
   "Orange": "A lot of vitamin C"
}

say you have the above dict defined in fruit.py starting from line#15

then you can do:

.. literalinclude:: ../path-to-file/fruit.py
   :language: python
   :lines: 15-
   :linenos:

and you will the Human readable value + comments etc right on doc


I needed an answer to this but didn't like the existing answers, so I bashed my head against the wall for a bit and came up with an imperfect but acceptable solution.

It uses pprint.pformat and generates the nodes directly, but I couldn't figure out how to generate the full markup including a cross-reference target because it would keep dying with KeyError: 'objtype' if I tried to add the outer layers, the Sphinx documentation wasn't any help, and the relevant Sphinx extensions are labyrinthine.

from importlib import import_module
from pprint import pformat
from docutils.parsers.rst import Directive
from docutils import nodes
from sphinx import addnodes

class PrettyPrintDirective(Directive):
    """Render a constant using pprint.pformat and insert into the document"""
    required_arguments = 1

    def run(self):
        module_path, member_name = self.arguments[0].rsplit('.', 1)

        member_data = getattr(import_module(module_path), member_name)
        code = pformat(member_data, 2, width=68)

        literal = nodes.literal_block(code, code)
        literal['language'] = 'python'

        return [
                addnodes.desc_name(text=member_name),
                addnodes.desc_content('', literal)
        ]


def setup(app):
    app.add_directive('pprint', PrettyPrintDirective)

Here's how I'm using it:

.. automodule:: quicktile.__main__
   :members:
   :exclude-members: XDG_CONFIG_DIR,DEFAULTS,CfgDict

----

.. pprint:: quicktile.__main__.DEFAULTS

(DEFAULTS being a dict that's used to create a configuration file with default values if none is found.)

...and here's how it looks:

enter image description here