2010-10-18 8 views
8

Ich habe Python Klassen mit Objektattributen, die nur als Teil deklariert den Konstruktor ausgeführt wird, etwa so:Wie kann ich Python/Sphinx Dokumentobjektattribute nur in __init__ deklarieren?

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)) 

Wenn ich jetzt entweder help(Foo) oder versuchen, verwenden Foo in Sphinx zu dokumentieren, die self.basepath und self.availableruns Attribute nicht gezeigt. Das ist ein Problem für Benutzer unserer API.

Ich habe versucht, nach einem Standard Weg zu suchen, um sicherzustellen, dass diese "dynamisch deklarierten" Attribute von dem Parser gefunden werden können (und vorzugsweise Docstring), aber bisher kein Glück. Irgendwelche Vorschläge? Vielen Dank.

Antwort

2

Sie könnten eine Klassenvariable mit dem gleichen Namen wie die Instanzvariablen definieren. Diese Klassenvariable wird dann von der Instanzvariable beschattet, wenn Sie sie festlegen. ZB:

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

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

die Tat, wenn die Instanz-Variable einen nützlichen unveränderlichen Standardwert (zB Keinerkeinekeines oder das leere Tupel) hat, dann können Sie einen wenig Speicher sparen, indem nicht nur die variable Einstellung, wenn den Standard haben sollte Wert. Natürlich wird dieser Ansatz nicht funktionieren, wenn Sie über eine Instanzvariable sprechen, die Sie möglicherweise löschen möchten (z. B. del foo.availableruns) - aber ich finde, das ist kein sehr häufiger Fall.

Wenn Sie sphinx verwenden und "autoattribute" eingestellt haben, sollte dies entsprechend dokumentiert werden. Oder, je nachdem, was Sie gerade tun, können Sie direkt die Sphinx .. py:attribute:: Direktive verwenden.

8

Ich habe versucht, nach einem Standardweg zu suchen, um sicherzustellen, dass diese "dynamisch deklarierten" Attribute vom Parser gefunden werden können (und vorzugsweise DocString), aber bisher kein Glück. Irgendwelche Vorschläge?

Sie können von keinem Parser jemals "erkannt" werden.

Python hat setattr. Der vollständige Satz von Attributen ist in keinem Sinne des Wortes "nachweisbar".

Sie müssen sie unbedingt im Docstring beschreiben.

[Es sei denn, Sie wollen eine Menge Meta-Programmierung machen, um Docstrings aus Dingen zu generieren, die Sie aus inspect oder so ähnlich gesammelt haben. Selbst dann würde Ihre „Lösung“ unvollständig sein, sobald Sie mit setattr starten.]

class Foo(object): 
    """ 
    :ivar basepath: 
    :ivar availableruns: 
    """ 
    def __init__(self, base): 
+0

Danke. Ja, ich weiß zu schätzen, dass die Attribute im Allgemeinen nicht berechenbar sind, nur war ich nicht sicher, ob es eine Heuristik gab, um einige von denen auf einfache/standardisierte Weise zu deklarieren, z. Quellenscannen statt Klassenobjektinspektion. Oder indem du den Code änderst, um diese Attribute als Eigenschaften zu deklarieren, damit Sphinx/help sie "findet". Aber egal, dieser Zeiger auf die Sphinx-Syntax für die Deklaration ihrer Existenz für Doc Zwecke wird gut tun: Prost! – andybuckley

+0

"Oder indem Sie den Code ändern, um diese Attribute als Eigenschaften zu deklarieren"? "deklarieren" ist kein Python-Konzept. Die Verwendung von Eigenschaftsmethodenfunktionen für Ihre Attribute funktioniert, wenn Sie die Mitglieder automatisch dokumentieren lassen wollen. Das scheint mehr als Arbeit zu sein, als sie einfach im Docstring zu dokumentieren. –

+0

Aber würde bedeuten, dass sie auf gleiche Weise mit anderen Methoden dokumentiert werden, was meiner Meinung nach die Qualität der Dokumentation erheblich verbessert.Ich bin bereit, dafür etwas mehr Arbeit zu leisten, wenn es die Leistung nicht trifft oder den Code undurchdringlich macht. Das war der Punkt der ersten Frage: Ich bin mir sicher, dass ich einen Weg finden kann, dies zu tun, aber ich habe mich gefragt, ob es einen (de facto) Standardansatz gibt, der die Nachteile minimiert. – andybuckley

Verwandte Themen