Ist es möglich, einem Namedtuple auf einfache Weise eine Dokumentationszeichenfolge hinzuzufügen?
Ich habe es versucht
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 das schneidet es nicht. Ist es möglich, auf andere Weise zu tun?
python
docstring
namedtuple
Rickard
quelle
quelle
namedtuple
in ein vollwertiges "Objekt" umwandeln ? Dabei einige der Leistungssteigerungen durch Named-Tupel verlieren?__slots__ = ()
der abgeleiteten Unterklasse hinzufügen , können Sie die Speicher- und Leistungsvorteile der Verwendung vonnamedtuple
__doc__
eine benutzerdefinierte Dokumentzeichenfolge zuweisen und im Originalobjekt speichern lassen.In Python 3 wird kein Wrapper benötigt, da die
__doc__
Attribute von Typen beschreibbar sind.Dies entspricht genau einer Standardklassendefinition, bei der die Dokumentzeichenfolge dem Header folgt.
Dies funktioniert in Python 2 nicht.
AttributeError: attribute '__doc__' of 'type' objects is not writable
.quelle
Kam über Google auf diese alte Frage und fragte sich das Gleiche.
Ich wollte nur darauf hinweisen, dass Sie es noch mehr aufräumen können, indem Sie namedtuple () direkt aus der Klassendeklaration heraus aufrufen:
quelle
__slots__ = ()
in die Klasse aufnehmen. Andernfalls erstellen Sie ein__dict__
für Ihre Attribute und verlieren dabei die Leichtigkeit von namedtuple.Ja, in mehrfacher Hinsicht.
Typisierung der Unterklasse.NamedTuple - Python 3.6+
Ab Python 3.6 können wir eine
class
Definitiontyping.NamedTuple
direkt mit einer Dokumentzeichenfolge (und Anmerkungen!) Verwenden:Im Vergleich zu Python 2
__slots__
ist es nicht erforderlich , leer zu deklarieren . In Python 3.8 ist dies nicht einmal für Unterklassen erforderlich.Beachten Sie, dass das Deklarieren
__slots__
nicht leer sein darf!In Python 3 können Sie das Dokument auch einfach in einem benannten Tupel ändern:
So können wir die Absicht für sie sehen, wenn wir Hilfe bei ihnen anrufen:
Dies ist im Vergleich zu den Schwierigkeiten, die wir in Python 2 haben, sehr einfach.
Python 2
In Python 2 müssen Sie
__slots__ == ()
Die Erklärung
__slots__
ist ein wichtiger Teil, den die anderen Antworten hier vermissen .Wenn Sie nicht deklarieren, können
__slots__
Sie den Instanzen veränderbare Ad-hoc-Attribute hinzufügen und Fehler einführen.Und nun:
Jede Instanz erstellt
__dict__
beim__dict__
Zugriff eine separate Instanz (das Fehlen von__slots__
wird die Funktionalität sonst nicht beeinträchtigen, aber die Leichtigkeit des Tupels, die Unveränderlichkeit und die deklarierten Attribute sind wichtige Merkmale von Namedtuples).Sie möchten auch ein
__repr__
, wenn Sie möchten, dass das, was in der Befehlszeile wiedergegeben wird, ein gleichwertiges Objekt enthält:Ein
__repr__
ähnliches wird benötigt, wenn Sie die Basis namenstupel mit einem anderen Namen erstellen (wie oben mit dem Argument name string'NTBase'
):Um den Repr zu testen, instanziieren Sie und testen Sie dann die Gleichheit eines Passes zu
eval(repr(instance))
Beispiel aus der Dokumentation
Die Dokumente geben auch ein solches Beispiel in Bezug auf
__slots__
- ich füge meine eigene Dokumentzeichenfolge hinzu:Dies zeigt die direkte Verwendung (wie eine andere Antwort hier vorschlägt). Beachten Sie jedoch, dass die direkte Verwendung beim Debuggen verwirrend werden kann, wenn Sie sich die Reihenfolge der Methodenauflösung ansehen. Aus diesem Grund habe ich ursprünglich die Verwendung
Base
als Suffix vorgeschlagen für die Basis namenstuple:Um zu verhindern, dass eine
__dict__
Unterklasse aus einer Klasse erstellt wird, die sie verwendet, müssen Sie sie auch in der Unterklasse deklarieren. Siehe auch diese Antwort für weitere Einschränkungen bei der Verwendung__slots__
.quelle
__slots__
. Ohne sie verlieren Sie den geringen Wert eines benannten Tupels.Seit Python 3.5 können Dokumentzeichenfolgen für
namedtuple
Objekte aktualisiert werden.Aus dem Whatsnew :
quelle
In Python 3.6+ können Sie Folgendes verwenden:
quelle
Es ist nicht erforderlich, eine Wrapper-Klasse zu verwenden, wie in der akzeptierten Antwort vorgeschlagen. Einfach buchstäblich fügt eine docstring:
Dies führt zu: (Beispiel mit
ipython3
):Voilà!
quelle
AttributeError: attribute '__doc__' of 'type' objects is not writable
.Sie können Ihre eigene Version der Factory-Funktion namedtuple von Raymond Hettinger erstellen und ein optionales
docstring
Argument hinzufügen . Es wäre jedoch einfacher - und wohl besser -, einfach Ihre eigene Fabrikfunktion mit der gleichen Grundtechnik wie im Rezept zu definieren. In jedem Fall erhalten Sie etwas Wiederverwendbares.quelle
Ich habe diese Funktion erstellt, um schnell ein benanntes Tupel zu erstellen und das Tupel zusammen mit jedem seiner Parameter zu dokumentieren:
Sie können dann ein neues benanntes Tupel erstellen:
Instanziieren Sie dann das beschriebene benannte Tupel mit Ihren eigenen Daten, dh.
Bei der Ausführung
help(MyTuple)
über die Python3-Befehlszeile wird Folgendes angezeigt:Alternativ können Sie den Parametertyp auch über Folgendes angeben:
quelle
Nein, Sie können nur Dokumentenmodulen zu Klassen, Klassen und Funktionen hinzufügen (einschließlich Methoden).
quelle