Pregunta

Estoy usando esfinge y el complemento AutoDoc para generar documentación API para mis módulos Python. Si bien puedo ver cómo documentar muy bien parámetros específicos, no puedo encontrar un ejemplo de cómo documentar un **kwargs parámetro.

¿Alguien tiene un buen ejemplo de una forma clara de documentarlos?

¿Fue útil?

Solución

pienso subprocess-Los documentos del módulo es un buen ejemplo. Dar una lista exhaustiva de todos los parámetros para un Top/Clase matriz. Luego, consulte esa lista para todos los demás ocurrencias de **kwargs.

Otros consejos

Después de encontrar esta pregunta, me resolví lo siguiente, que es válido Sphinx y funciona bastante bien:

def some_function(first, second="two", **kwargs):
    r"""Fetches and returns this thing

    :param first:
        The first parameter
    :type first: ``int``
    :param second:
        The second parameter
    :type second: ``str``
    :param \**kwargs:
        See below

    :Keyword Arguments:
        * *extra* (``list``) --
          Extra stuff
        * *supplement* (``dict``) --
          Additional content

    """

los r"""...""" se requiere para hacer de este un documento "crudo" y, por lo tanto, mantener el \* intacto (para que sphinx se elija como literal * y no el comienzo del "énfasis").

El formato elegido (Lista de viñetas con tipo paréntesis y descripción separada por M-Dash) es simplemente para que coincida con el formato automatizado proporcionado por Sphinx.

Una vez que haya realizado este esfuerzo de hacer que la sección "Argumentos de palabras clave" parezca la sección de "parámetros" predeterminados, parece que podría ser más fácil lanzar su propia sección de parámetros desde el principio (según algunas de las otras respuestas) , pero como prueba de concepto, esta es una forma de lograr un buen aspecto para **kwargs Si ya estás usando Sphinx.

Dockstrings de estilo de Google analizados por Sphinx

Descargo de responsabilidad: no probado.

De este recorte de la Sphinx Docstring Ejemplo, la *args y **kwargs quedan no expandido:

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.

me gustaría sugerir La siguiente solución para la compacidad:

    """
    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 
        ...

Date cuenta cómo, Optional no es necesario para **key argumentos.

De lo contrario, puede intentar enumerar explícitamente los *args en Other Parameters y **kwargs bajo la Keyword Args (Ver Parsed secciones):

    """
    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 
        ...

Hay un Doctstring Ejemplo para Sphinx en su documentación. Específicamente muestran lo siguiente:

def public_fn_with_googley_docstring(name, state=None):
"""This function does something.

Args:
   name (str):  The name to use.

Kwargs:
   state (bool): Current state to be in.

Returns:
   int.  The return code::

      0 -- Success!
      1 -- No good.
      2 -- Try again.

Raises:
   AttributeError, KeyError

A really great idea.  A way you might use me is

>>> print public_fn_with_googley_docstring(name='foo', state=None)
0

BTW, this always returns 0.  **NEVER** use with :class:`MyPublicClass`.

"""
return 0

Aunque preguntaste sobre Explícitamente, también señalaría el Guía de estilo de Google Python. Su ejemplo de documento parece implicar que no llaman específicamente a Kwargs. (Other_Silly_Variable = Ninguno)

def fetch_bigtable_rows(big_table, keys, other_silly_variable=None):
"""Fetches rows from a Bigtable.

Retrieves rows pertaining to the given keys from the Table instance
represented by big_table.  Silly things may happen if
other_silly_variable is not None.

Args:
    big_table: An open Bigtable Table instance.
    keys: A sequence of strings representing the key of each table row
        to fetch.
    other_silly_variable: Another optional variable, that has a much
        longer name than the other args, and which does nothing.

Returns:
    A dict mapping keys to the corresponding table row data
    fetched. Each row is represented as a tuple of strings. For
    example:

    {'Serak': ('Rigel VII', 'Preparer'),
     'Zim': ('Irk', 'Invader'),
     'Lrrr': ('Omicron Persei 8', 'Emperor')}

    If a key from the keys argument is missing from the dictionary,
    then that row was not found in the table.

Raises:
    IOError: An error occurred accessing the bigtable.Table object.
"""
pass

ABB tiene una pregunta sobre la respuesta aceptada de hacer referencia a la documentación de gestión del subproceso. Si importa un módulo, puede ver rápidamente las documentos del módulo a través de Inspect.GetSource.

Un ejemplo del intérprete de Python utilizando la recomendación de Silent Ghost:

>>> import subprocess
>>> import inspect
>>> import print inspect.getsource(subprocess)

Por supuesto, también puede ver la documentación del módulo a través de la función de ayuda. Por ejemplo, ayuda (subprocesos)

Personalmente, no soy un fanático del documento de subprocesos para Kwargs como ejemplo, pero al igual que el ejemplo de Google, no enumera Kwargs por separado como se muestra en el ejemplo de documentación de Sphinx.

def call(*popenargs, **kwargs):
"""Run command with arguments.  Wait for command to complete, then
return the returncode attribute.

The arguments are the same as for the Popen constructor.  Example:

retcode = call(["ls", "-l"])
"""
return Popen(*popenargs, **kwargs).wait()

Incluyo esta respuesta a la pregunta de ABB porque vale la pena señalar que puede revisar la fuente o documentación de cualquier módulo de esta manera para obtener información e inspiración para comentar su código.

Si alguien más está buscando una sintaxis válida. Aquí hay un ejemplo de documento. Así es como lo hice, espero que sea útil para ti, pero no puedo afirmar que cumple con algo en 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

Esto depende del estilo de documentación que use, pero si está utilizando el numpydoc estilo se recomienda documentar **kwargs usando Other Parameters.

Por ejemplo, siguiendo el ejemplo de Quornian:

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}``.
    """

Tenga en cuenta especialmente que se recomienda dar los valores predeterminados de KWARGS, ya que estos no son obvios desde la firma de la función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top