Python hat das wunderbare collections
-Modul, das über Tools verfügt, mit denen Sie eine vollständige dict
implementieren können. (Zum Beispiel) aus einer minimalen Menge von Methoden. Gibt es eine ähnliche Sache für die file
-Schnittstelle in Python? Wenn nicht, was würden Sie als eine minimale Menge von Methoden empfehlen, die für ein file
-ähnliches Objekt für Duck-Typing-Zwecke implementiert werden sollen?
Und wie gehen Sie mit Dingen um, die Ihre Datei als Objekt in einer with
-Anweisung verwenden möchten, wie Sie es mit einer normalen Datei tun können oder die Sie darüber iterieren möchten (wie Sie es mit einer normalen Datei tun können)? oder wer möchte readline
oder readlines
aufrufen und etwas Intelligentes und Nützliches machen lassen (wie bei einer normalen Datei)? Müssen Sie sie alle selbst umsetzen? Oder gibt es bessere Möglichkeiten?
Ich weiß, dass ich jedes einzelne von ihnen selbst mit der Hand umsetzen kann. Aber die collections
Schnittstelle erlaubt mir, dict
zu implementieren, indem nur __len__
, __iter__
, __setitem__
und __getitem__
implementiert werden. Ich bekomme% Co_de%,% Co_de%,% Co_de%,% Co_de%,% Co_de%,% Co_de%,% Co_de%,% Co_de%,% Co_de%,% Co_de%,% Co_de% und% Co_de% alles kostenlos. Es gibt eine minimale Schnittstelle für pop
definiert, und wenn ich es implementiere, bekomme ich die vollständige popitem
-Schnittstelle, wobei alle zusätzlichen Methoden in Bezug auf die minimale Schnittstelle implementiert werden.
Ähnlich würde ich gerne wissen, was die minimale Schnittstelle für Datei ist, die ich implementieren muss, um die volle Schnittstelle zu erhalten. Gibt es eine Möglichkeit, clear
, update
, setdefault
, __contains__
, keys
und items
zu erhalten, wenn ich nur values
, get
und __eq__
implementiere, oder muss ich das tun Implementiere alles selbst von Hand jedes Mal, wenn ich die volle __ne__
Schnittstelle möchte?
Die with-Anweisung benötigt einen Kontextmanager:
Der Dateityp ist vollständig definiert:
Scheint ziemlich einfach.
Die Dokumentation listet die Methoden und Attribute einer Datei und eines Kontextmanagers auf. Implementieren Sie diese.
Welche weiteren Informationen benötigen Sie?
Wenn Sie möchten, dass alle Methoden funktionieren, müssen Sie alle Methoden implementieren. Im Gegensatz zu den Sammlungen gibt es keine abstrakte Basisklasse für Dateien.
Ich würde io.IOBase [1] und io.RawIOBase für Kompatibilität mit & gt; 2.6 betrachten. Dadurch werden Sie mit 3.x weitermachen (io implementiert die 3.x-Dateischnittstelle).
[1] Ссылка
Sie haben es irgendwie selbst beantwortet. Obwohl es keine "speziellen" Methoden gibt, müssen Sie die Dateischnittstelle implementieren, indem Sie einige Methoden bereitstellen, die normalerweise mit Dateien verbunden sind. Duck Typing kümmert sich um den Rest.
Sie brauchen nur eine read
und / oder eine write
Methode (abhängig davon, ob Sie lesbar und / oder schreibbar sein wollen), die sich wie ein normales Dateiobjekt verhalten. Sie können sich die Python-Dateiobjekt -Referenz ansehen, um alle Methoden von zu sehen ein Dateiobjekt Grundsätzlich gilt, je mehr Sie implementieren, desto mehr Situationen wird Ihre Klasse anstelle einer Datei arbeiten. (Wenn Sie zum Beispiel seek
implementieren, funktioniert es in jeder Funktion, die das Suchen nach einer Datei ausführt.) Beachten Sie, dass hier ein Kontinuum existiert, es gibt kein absolutes "es unterstützt das Dateiprotokoll oder es tut es nicht. " Tatsächlich gibt es keine Möglichkeit, an allen Stellen, an denen dateiähnliche Objekte unterstützt werden, zu 100% zu arbeiten, da ein Teil des Codes auf Low-Level-Details des echten file
-Typs zugreifen wird, und deins wird dort nicht funktionieren.
Zusammengefasst funktioniert jede Klasse, die read
und write
implementiert, in den meisten Situationen, in denen ein "dateiähnliches Objekt" benötigt wird.
(Beachten Sie, dass die speziellen Methodennamen wie __getitem__
für Dicts wirklich nicht speziell sind, außer dass sie von einer speziellen Syntax wie [key]
verwendet werden - deshalb hat dict spezielle Methodennamen und die Datei nicht.)
Tags und Links python