Digamos que tenemos una función API compleja, importada de alguna biblioteca.
def complex_api_function(
number, <lots of positional arguments>,
<lots of keyword arguments>):
'''really long docstring'''
# lots of code
Quiero escribir un contenedor simple alrededor de esa función para hacer un pequeño cambio. Por ejemplo , debería ser posible pasar el primer argumento como una cadena. ¿Cómo documentar esto? Consideré las siguientes opciones:
Opción 1:
def my_complex_api_function(number_or_str, *args, **kwargs):
'''
Do something complex.
Like `complex_api_function`, but first argument can be a string.
Parameters
----------
number_or_str : int or float or str
Can be a number or a string that can be interpreted as a float.
<copy paste description from complex_api_function docstring>
*args
Positional arguments passed to `complex_api_function`.
**kwargs
Keyword arguments passed to `complex_api_function`.
Returns
-------
<copy paste from complex_api_function docstring>
Examples
--------
<example where first argument is a string, e.g. '-5.0'>
'''
return complex_api_function(float(number_or_str), *args, **kwargs)
Desventaja: el usuario debe consultar los documentos de complex_api_function
para obtener información sobre *args
y **kwargs
. Necesita ajuste cuando la copia pegó secciones del complex_api_function
cambio.
Opcion 2:
Copie y pegue complex_api_function
la firma (en lugar de usar *args
y **kwargs
) y su cadena de documentos. Realice un pequeño cambio en la cadena de documentación que menciona que el primer argumento también puede ser una cadena. Agrega un ejemplo.
Desventaja: detallado, debe cambiarse cuando complex_api_function
cambia.
Opcion 3:
Decorar my_complex_api_function
con functools.wraps(complex_api_function)
.
Desventaja: no hay información que number
también pueda ser una cadena.
Estoy buscando una respuesta que no dependa de los detalles de los cambios my_complex_api_function
. El procedimiento debería funcionar para cualquier pequeño ajuste al original complex_api_function
.
complex_api_function
espera para su parámetro, ya que solo duplica la información (tal vez también tienen múltiples opciones). Presumiblemente, el usuario del contenedor ya está familiarizado con la función original y, si no, siempre puede señalarlos a los documentos originales. De todos modos, creo que este es el camino a seguir, solo documente lo que se agrega a la función original + proporcionando detalles sobre cómo ese nuevo tipo se convierte al original (esos detalles pueden ser importantes). Es decir, cómo se trata ese argumento para ser compatible con la función original.