モジュールのドキュメントにあるdecorator_apply
レシピを使用して、保存された関数シグネチャを含む完全なドキュメントを作成することができました。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
これは、私が使用した単純な ReST ソースです。
.. automodule:: myfabfile
:members:
いくつかのコメント:
shahjapan によって提出された回答では、一般的なケースでドキュメント文字列を保持する方法が説明されていますが、@task
デコレータが外部ライブラリで定義されているという事実には対処していません。
とにかく、 で装飾された関数については、docstring が自動的に保存されることがわかりました@task
。以下は、__init__
ファブリックのtasks.WrappedCallableTask
クラスのメソッドです。
if hasattr(callable, '__doc__'):
self.__doc__ = callable.__doc__
したがって、それはすでにそのまま機能しています(明示的な.. autofunction::
ものが必要です)。関数の署名も保持されるようにするために、decorator
モジュールを上記のように使用できます。
アップデート
モジュールを使用すると、decorator
Fabric の動作が中断されます (コメントを参照)。ですから、それは結局実現不可能かもしれません。別の方法として、次の修正された reST マークアップをお勧めします。
.. automodule:: myfabfile2
:members:
.. autofunction:: setup_development(remote='origin', branch='development')
つまり、完全な関数シグネチャを含める必要があります。これは、Sphinx のドキュメントでも提案されていることです ( 「これは、メソッドのシグネチャがデコレーターによって隠されている場合に役立ちます。」を参照してください)。