__init__でのみ宣言されたPython/Sphinxドキュメントオブジェクト属性を作成するにはどうすればよいですか?
-
08-10-2019 - |
質問
私は、コンストラクターの実行の一部としてのみ宣言されているオブジェクト属性を備えたPythonクラスを持っています。
class Foo(object):
def __init__(self, base):
self.basepath = base
temp = []
for run in os.listdir(self.basepath):
if self.foo(run):
temp.append(run)
self.availableruns = tuple(sorted(temp))
どちらかを今使用する場合 help(Foo)
または文書化しようとします Foo
スフィンクスでは、 self.basepath
と self.availableruns
属性は表示されません。これは、APIのユーザーにとって問題です。
これらの「動的に宣言された」属性がパーサーによって見つかる(そしてできればdocstringd)を確保するための標準的な方法を検索しようとしましたが、これまでのところ運はありません。助言がありますか?ありがとう。
解決
インスタンス変数と同じ名前のクラス変数を定義できます。そのクラス変数は、設定するときにインスタンス変数によって影が付けられます。例えば:
class Foo(object):
#: Doc comment for availableruns
availableruns = ()
def __init__(self, base):
...
self.availableruns = tuple(sorted(temp))
実際、インスタンス変数に有用な場合 不変 デフォルト値(例:空のタプルなど)、デフォルト値が必要な場合に変数を設定しないだけで少しメモリを保存できます。もちろん、削除したいインスタンス変数について話している場合、このアプローチは機能しません(例: del foo.availableruns
) - しかし、それはあまり一般的なケースではないと思います。
Sphinxを使用していて、「自動アトリブ」セットを使用している場合、これは適切に文書化されるはずです。または、あなたがしていることのコンテキストに応じて、スフィンクスを直接使用することができます .. py:attribute::
指令。
他のヒント
これらの「動的に宣言された」属性がパーサーによって見つかる(そしてできればdocstringd)を確保するための標準的な方法を検索しようとしましたが、これまでのところ運はありません。助言がありますか?
パーサーによって「検出」することはできません。
Pythonにはあります setattr
. 。属性の完全なセットは、単語の意味では「検出可能」ではありません。
ドックストリングでそれらを絶対に説明する必要があります。
から集めたものからドキュストリングを生成するためにメタプログラミングの束をしたいのでない限り inspect
か何か。それでも、使用を開始するとすぐに「ソリューション」が不完全になります setattr
.]
class Foo(object):
"""
:ivar basepath:
:ivar availableruns:
"""
def __init__(self, base):