Search code examples
pythonpython-sphinxdocstring

Parsing function docstring in sphinx.autodoc format


I have many functions in Python of the type:

def foobar(one, two):
    """
    My function.
    :param int one: My one argument.
    :param int two: My two argument.
    :rtype: Something nice.
    """
    return 100 + one + two

And I need to parse the docstring to have a dictionary something like:

{
    'sdesc'  : 'My function.',
    'params' : [('one', 'My one argument.'), ('two', 'My two argument.')],
    'rtype'  : 'Something nice.'
}

I can use sphinx.util.docstrings.prepare_docstring as follows:

>>> prepare_docstring(foobar.__doc__)
['My function.', ':param int one: My one argument.', ':param int two: My two argument.', ':rtype: Something nice.', '']

I could create my own parser, maybe using regex for params and rtype, and stuff.

But is there a better way to do it or a better approach? How sphinx.ext.autodoc does it? Any other advice on how to parse this kind of docstrings?


Solution

  • openstack/rally's parse_docstrings() (permalink) take a function's docstring in reStructuredText (reST) format as an input and returns 4 values-short_description, long_description, params and returns

    For e.g. if the function and its docstring is

    def sample(self, task, deployment=None):
        """Start benchmark task.
    
        Implement sample function's long description.
    
        :param task: Path to the input task file.
        :param deployment: UUID or name of the deployment
    
        :returns: NIL
        """
    

    Then parse_docstrings() function will return-

    { "short_description" : "Start benchmark task.",
      "long_description" : "Implement sample function's long description.",
      "params": [ { "name" : "task", "doc": "Path to the unput task file" },
                  { "name" : "deployment", "doc" :  "UUID or name of the deployment" } ]
      "returns" : "NIL"
    }
    

    You can modify the above function as per your needs.