pydoc は言わずと知れたドキュメント生成のための標準ライブラリです。
この pydoc で生成されるドキュメントには、protected や private 属性の変数/関数は含まれません。モジュールの使用者にとってはこの仕様でもいいのですが、モジュールを読んで解析 or 変更しようとしている人にとっては、この仕様は望ましくありません。
この部分の処理を行っているのは、pydoc の以下の関数です(pydoc のバージョンは 3.4)。
def visiblename(name, all=None, obj=None):
"""Decide whether to show documentation on a variable."""
# Certain special names are redundant or internal.
# XXX Remove __initializing__?
if name in {'__author__', '__builtins__', '__cached__', '__credits__',
'__date__', '__doc__', '__file__', '__spec__',
'__loader__', '__module__', '__name__', '__package__',
'__path__', '__qualname__', '__slots__', '__version__'}:
return 0
# Private names are hidden, but special names are displayed.
if name.startswith('__') and name.endswith('__'): return 1
# Namedtuples have public fields and methods with a single leading underscore
if name.startswith('_') and hasattr(obj, '_fields'):
return True
if all is not None:
# only document that which the programmer exported in __all__
return name in all
else:
return not name.startswith('_')
visiblename() の最後の行で、_ で始まる変数/関数が弾かれています。この最後の行を変更した関数を作り、visiblename() と置き換えることで、protected や private 属性でもドキュメントに表示させることができます。
以下は visiblename() を置き換える具体的なファイルの例です。
### mypydoc.py
# -*- coding:utf-8 -*-
import pydoc
def my_visiblename(name, all=None, obj=None):
"""Decide whether to show documentation on a variable."""
# Certain special names are redundant or internal.
# XXX Remove __initializing__?
if name in ['__author__', '__builtins__', '__cached__', '__credits__',
'__date__', '__doc__', '__file__', '__spec__',
'__loader__', '__module__', '__name__', '__package__',
'__path__', '__qualname__', '__slots__', '__version__']:
return 0
# Private names are hidden, but special names are displayed.
if name.startswith('__') and name.endswith('__'): return 1
# Namedtuples have public fields and methods with a single leading underscore
if name.startswith('_') and hasattr(obj, '_fields'):
return True
if all is not None:
# only document that which the programmer exported in __all__
return name in all
else:
# change to make protected/private variable visible
return True
# return not name.startswith('_')
def main():
pydoc.visiblename = my_visiblename
pydoc.cli()
if __name__ == '__main__':
main()
ここで示した mypydoc.py は、pydoc.py と同等の使い方(e.g. python mypydoc.py -w modulename)が可能です。
0 件のコメント:
コメントを投稿