Was ist die minimale Teilmenge von Dateimethoden, die ich implementieren muss, um die vollständige Python-Dateischnittstelle zu erhalten?

8

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?

    
Omnifarious 17.03.2011, 04:56
quelle

3 Antworten

3

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.

    
S.Lott 17.03.2011, 10:17
quelle
2

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] Ссылка

    
Mike Ramirez 17.03.2011 05:03
quelle
2

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

    
mgiuca 17.03.2011 05:04
quelle

Tags und Links