10

次のように、コンストラクターの実行の一部としてのみ宣言されるオブジェクト属性を持つ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))

どちらかを使用するか、Sphinxでhelp(Foo)ドキュメント化しようとすると、属性と属性が表示されません。これは、APIのユーザーにとって問題です。Fooself.basepathself.availableruns

これらの「動的に宣言された」属性がパーサーによって検出される(そしてできればdocstringされる)ことを保証するための標準的な方法を検索しようとしましたが、これまでのところ運がありません。助言がありますか?ありがとう。

4

2 に答える 2

11

これらの「動的に宣言された」属性がパーサーによって検出される(そしてできればdocstringされる)ことを保証するための標準的な方法を検索しようとしましたが、これまでのところ運がありません。助言がありますか?

それらは、パーサーによって「検出」されることはありません。

Pythonにはsetattr。属性の完全なセットは、どのような意味でも「検出可能」になることはありません。

あなたは絶対にそれらをdocstringで説明しなければなりません。

[収集したものなどからdocstringを生成するために、一連のメタプログラミングを実行したい場合を除きますinspect。それでも、使い始めるとすぐに「解決策」は不完全になりますsetattr。]

class Foo(object):
    """
    :ivar basepath:
    :ivar availableruns:
    """
    def __init__(self, base):
于 2010-10-18T14:20:13.413 に答える
2

インスタンス変数と同じ名前のクラス変数を定義できます。そのクラス変数は、設定時にインスタンス変数によってシャドウされます。例えば:

class Foo(object):
    #: Doc comment for availableruns
    availableruns = ()

    def __init__(self, base):
        ...
        self.availableruns = tuple(sorted(temp))

実際、インスタンス変数に有用な不変のデフォルト値(たとえば、Noneまたは空のタプル)がある場合、デフォルト値が必要な場合は変数を設定しないことで、メモリを少し節約できます。もちろん、削除したいインスタンス変数(たとえばdel foo.availableruns)について話している場合、このアプローチは機能しませんが、それはあまり一般的なケースではないことがわかりました。

sphinxを使用していて、「autoattribute」が設定されている場合、これは適切に文書化されるはずです。.. py:attribute::または、実行しているコンテキストに応じて、Sphinxディレクティブを直接使用することもできます。

于 2011-07-18T18:58:48.827 に答える