que era capaz de producir una documentación completa con la firma de función conservada mediante el uso de la receta decorator_apply
found in the documentation para el módulo decorator
.
""" myfabfile.py """
from fabric.api import task as origtask
from decorator import FunctionMaker
def decorator_apply(dec, func):
return FunctionMaker.create(
func, 'return decorated(%(signature)s)',
dict(decorated=dec(func)), __wrapped__=func)
def task(func):
return decorator_apply(origtask, func)
@task
def setup_development(remote='origin', branch='development'):
"""Setup your development environment.
* Checkout development branch & pull updates from remote
* Install required python packages
* Symlink development settings
* Sync and migrate database
* Build HTML Documentation and open in web browser
:param remote: Name of remote git repository.
:param branch: Name of your development branch.
"""
pass
Ésta es la fuente simple descanso que he utilizado:
.. automodule:: myfabfile
:members:
Algunos comentarios:
La respuesta presentada por shahjapan explica cómo preservar la cadena de documentación en el caso general, pero lo hace no aborda el hecho de que el decorador @task
se define en una biblioteca externa.
De todos modos, resulta que el docstring se conserva automáticamente para las funciones decoradas con @task
. El siguiente es en el método de la clase de tela tasks.WrappedCallableTask
__init__
:
if hasattr(callable, '__doc__'):
self.__doc__ = callable.__doc__
Así que ya funciona como es (una explícita .. autofunction::
se necesita). Para garantizar que la firma de la función también se conserve, el módulo decorator
se puede usar como se muestra arriba.
actualización
El uso del módulo decorator
rompe cosas en el funcionamiento de Tela (ver comentario). Entonces eso puede no ser factible después de todo. Como alternativa, sugiero la siguiente marcación reST modificada:
.. automodule:: myfabfile2
:members:
.. autofunction:: setup_development(remote='origin', branch='development')
Es decir, deberá incluir la firma de la función completa. Esto también es lo que se sugiere en la documentación de Sphinx (vea "This is useful if the signature from the method is hidden by a decorator.").
Un problema es la falta de espacio entre '.. automodule ::' y 'fabfile'. Y si desea usar' ..autofunction :: '(No creo que lo necesite), debe ir precedido de una línea en blanco. – mzjn
¡Gracias, eso funcionó! Parece que '': miembros: '' no recoge las funciones envueltas (según la respuesta dada por shahjapan) , así que puedo usar '' wraps'' o usar '' .. autofunction :: '' que funciona con el decorador '' @ task'' –