What is the correct way to document a **kwargs parameter?

后端 未结 8 996
清酒与你
清酒与你 2021-01-30 02:48

I\'m using sphinx and the autodoc plugin to generate API documentation for my Python modules. Whilst I can see how to nicely document specific parameters, I cannot find an exam

相关标签:
8条回答
  • 2021-01-30 03:14

    I think subprocess-module's docs is a good example. Give an exhaustive list of all parameters for a top/parent class. Then just refer to that list for all other occurrences of **kwargs.

    0 讨论(0)
  • 2021-01-30 03:17

    If you are looking for how to do this in numpydoc style, you can simply mention **kwargs in Parameters section without specifying type - as demonstrated in numpydoc example from the sphinx extension napolean and docstring guide from pandas documentation sprint 2018.

    Here's an example I found from LSST developer guide which very well explains what should be the description of **kwargs parameter:

    def demoFunction(namedArg, *args, flag=False, **kwargs):
        """Demonstrate documentation for additional keyword and
        positional arguments.
    
        Parameters
        ----------
        namedArg : `str`
            A named argument that is documented like always.
        *args : `str`
            Additional names.
    
            Notice how the type is singular since the user is expected to pass individual
            `str` arguments, even though the function itself sees ``args`` as an iterable
            of `str` objects).
        flag : `bool`
            A regular keyword argument.
        **kwargs
            Additional keyword arguments passed to `otherApi`.
    
            Usually kwargs are used to pass parameters to other functions and
            methods. If that is the case, be sure to mention (and link) the
            API or APIs that receive the keyword arguments.
    
            If kwargs are being used to generate a `dict`, use the description to
            document the use of the keys and the types of the values.
        """
    

    Alternatively, building upon what @Jonas Adler suggested, I find it better to put the **kwargs and its description in Other Parameters section - even this example from matplotlib documentation guide suggests the same.

    0 讨论(0)
  • 2021-01-30 03:18

    I am unable to find the actual link to the docs but this works (using Sphinx 3.4.3):

    class Foo:
        """A Foo implementation
    
        :param str foo: Foo
        :param int bar: Bar
        :keyword str key1: kwarg 1
        :keyword str key2: kwarg 2
        :keyword int key3: kwarg 3
        """
    
        def __init__(self, foo, bar, **kwargs):
            pass
    
    0 讨论(0)
  • 2021-01-30 03:19

    Google Style docstrings parsed by Sphinx

    Disclaimer: not tested.

    From this cutout of the sphinx docstring example, the *args and **kwargs are left unexpanded:

    def module_level_function(param1, param2=None, *args, **kwargs):
        """
        ...
    
        Args:
            param1 (int): The first parameter.
            param2 (Optional[str]): The second parameter. Defaults to None.
                Second line of description should be indented.
            *args: Variable length argument list.
            **kwargs: Arbitrary keyword arguments.
    

    I would suggest the following solution for compactness:

        """
        Args:
            param1 (int): The first parameter.
            param2 (Optional[str]): The second parameter. Defaults to None.
                Second line of description should be indented.
            *param3 (int): description
            *param4 (str): 
            ...
            **key1 (int): description 
            **key2 (int): description 
            ...
    

    Notice how, Optional is not required for **key arguments.

    Otherwise, you can try to explicitly list the *args under Other Parameters and **kwargs under the Keyword Args (see parsed sections):

        """
        Args:
            param1 (int): The first parameter.
            param2 (Optional[str]): The second parameter. Defaults to None.
                Second line of description should be indented.
    
        Other Parameters:
            param3 (int): description
            param4 (str): 
            ...
    
        Keyword Args:
            key1 (int): description 
            key2 (int): description 
            ...
    
    0 讨论(0)
  • 2021-01-30 03:19

    If anyone else is looking for some valid syntax.. Here's an example docstring. This is just how I did it, I hope it's useful to you, but I can't claim that it's compliant with anything in particular.

    def bar(x=True, y=False):
        """
        Just some silly bar function.
    
        :Parameters:
          - `x` (`bool`) - dummy description for x
          - `y` (`string`) - dummy description for y
        :return: (`string`) concatenation of x and y.
        """
        return str(x) + y
    
    def foo (a, b, **kwargs):
        """
        Do foo on a, b and some other objects.
    
        :Parameters:
          - `a` (`int`) - A number.
          - `b` (`int`, `string`) - Another number, or maybe a string.
          - `\**kwargs` - remaining keyword arguments are passed to `bar`
    
        :return: Success
        :rtype: `bool`
        """
        return len(str(a) + str(b) + bar(**kwargs)) > 20
    
    0 讨论(0)
  • 2021-01-30 03:23

    This depends on the style of documentation you use, but if you are using the numpydoc style it is recommend to document **kwargs using Other Parameters.

    For example, following quornian's example:

    def some_function(first, second="two", **kwargs):
        """Fetches and returns this thing
    
        Parameters
        ----------
        first : `int`
            The first parameter
        second : `str`, optional
            The second parameter
    
        Other Parameters
        ----------------
        extra : `list`, optional
            Extra stuff. Default ``[]``.
        suplement : `dict`, optional
            Additional content. Default ``{'key' : 42}``.
        """
    

    Note especially that it is recommended to give the defaults of kwargs, since these are not obvious from the function signature.

    0 讨论(0)
提交回复
热议问题