Hinzufügen von docstrings zu namedtuples?
Ist es möglich, eine Dokumentation, ein string zu einem namedtuple in einer einfachen Art und Weise?
Versuchte ich
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
"""
A point in 2D space
"""
# Yet another test
"""
A(nother) point in 2D space
"""
Point2 = namedtuple("Point2", ["x", "y"])
print Point.__doc__ # -> "Point(x, y)"
print Point2.__doc__ # -> "Point2(x, y)"
aber, die nicht schneiden Sie es. Ist es möglich, auf eine andere Weise tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erreichen dies, indem eine einfache, leere wrapper-Klasse um den zurückgegebenen Wert aus
namedtuple
. Inhalt einer Datei, die ich erstellt (nt.py
):Dann in der Python-REPL:
Oder Sie tun können:
Wenn Sie nicht wie zu tun, die von hand jedes mal, es ist trivial zu schreiben, eine Art-factory-Funktion, um dies zu tun:
welche Ausgänge:
namedtuple
in eine vollwertige "Objekt"? Dadurch verlieren einige der performance-Gewinne von namens-Tupel?__slots__ = ()
zu der abgeleiteten Unterklasse, die Sie behalten können Sie die Speicher-und performance-Vorteile der Verwendung vonnamedtuple
Kam über diese alte Frage über Google, während Fragen, die gleiche Sache.
Wollte nur darauf hinweisen, dass Sie ordentlich noch durch den Aufruf namedtuple() rechts von der Klasse Erklärung:
__slots__ = ()
in der Klasse. Andernfalls erstellen Sie ein__dict__
für Ihre attrs, verlieren die leichte Natur der namedtuple.In Python 3, kein wrapper benötigt wird, als die
__doc__
Attribute der Typen beschreibbar ist.Diesem genau entspricht einer standard-definition der Klasse, wo der docstring folgt der header.
Funktioniert das nicht in Python 2.
AttributeError: attribute '__doc__' of 'type' objects is not writable
.Python 3
In Python 3 können Sie leicht ändern, die doc auf Ihrem namedtuple:
Welches uns erlaubt, das anzeigen der Absicht für Sie, wenn wir Hilfe rufen auf:
Dies ist sehr einfach im Vergleich zu den Schwierigkeiten, die wir haben, erreichen Sie die gleiche Sache in Python 2.
Python 2
In Python 2, müssen Sie
__slots__ == ()
Deklarieren
__slots__
ist eine wichtige Rolle, dass die anderen Antworten hier vermissen .Wenn Sie nicht erklären
__slots__
- man könnte hinzufügen, veränderlichen ad-hoc-Attribute der Instanzen, die Einführung bugs.Und jetzt:
Jede Instanz wird eine separate
__dict__
wenn__dict__
zugegriffen wird (das fehlen von__slots__
nicht beeinträchtigen die Funktionalität, aber die lightweightness des Tupel, Unveränderlichkeit und deklarierten Attribute sind alle wichtigen Funktionen namedtuples).Werden Sie wollen auch einen
__repr__
wenn Sie möchten, was im Klartext auf der Kommandozeile geben Sie ein gleichwertiges Objekt:einen
__repr__
wie diese ist erforderlich, wenn Sie erstellen die Basis namedtuple mit einem anderen Namen (wie wir es oben mit dem Namen string-argument,'NTBase'
):Testen die repr instanziieren, dann test auf Gleichheit der einen pass zu
eval(repr(instance))
Beispiel aus der Dokumentation
Den docs auch geben so ein Beispiel, über
__slots__
- ich bin das hinzufügen meiner eigenen docstring zu:Diese zeigt in-place-Nutzung (wie die andere Antwort hier schon andeutet), aber beachten Sie, dass die in-place-Verwendung kann verwirrend werden, wenn man sich auf die Methode, die Auflösung um, wenn Sie das Debuggen, das ist der Grund, warum ich ursprünglich vorgeschlagen
Base
als suffix für die Basis namedtuple:Zu verhindern Schaffung eines
__dict__
beim Erben von einer Klasse, die verwendet wird, müssen Sie auch erklären, es in der Unterklasse. Siehe auch diese Antwort weitere Einschränkungen auf die Verwendung von__slots__
.__slots__
. Ohne es, Sie zu verlieren, die leicht den Wert eines namedtuple.Da Python 3.5, docstrings für
namedtuple
Objekte aktualisiert werden können.Aus der whatsnew:
In Python 3.6+, die Sie verwenden können:
Keine Notwendigkeit für die Verwendung einer wrapper-Klasse, so der Vorschlag die akzeptierte Antwort. Einfach wörtlich hinzufügen einen docstring:
Ergibt dies: (Beispiel mit
ipython3
):Voilà!
AttributeError: attribute '__doc__' of 'type' objects is not writable
.Könnten Sie zusammenbrauen Ihre eigene version des namedtuple factory-Funktion von Raymond Hettinger und fügen Sie eine optionale
docstring
argument. es wäre Jedoch einfacher-und wohl besser-einfach definieren Sie Ihre eigene factory-Funktion unter Verwendung der gleichen grundlegenden Verfahren wie im Rezept. so oder so, werden Sie am Ende mit etwas wiederverwendbar.Habe ich diese Funktion schnell zu erstellen eine benannte Tupel-und Dokument-Tupel zusammen mit jedem der Parameter:
Können Sie dann erstellen Sie eine neue benannte Tupel:
Dann instanziieren der beschriebenen benannte Tupel mit Ihren eigenen Daten, dh.
Beim ausführen
help(MyTuple)
über die Python ist3 Befehlszeile die folgende angezeigt:Alternativ können Sie auch angeben, Typ des Parameters über:
Nein, Sie können nur hinzufügen doc-strings zu Modulen, Klassen und Funktionen (einschließlich der Methoden)