2010-01-16 12 views
13

Ich habe eine benutzerdefinierte Klasse mit einer serialize-Methode, und ich möchte in der Lage sein, diese Klasse direkt in Dateien schreiben und den Rückgabewert der serialize-Methode in Python 2.6 geschrieben werden. (Ich bin nicht meine Objekte versuchen, pickle, das etwas ist ganz anders.) Zum Beispiel:Welche Methoden implementieren die Pufferschnittstelle in Python?

class Foo(object): 
    def serialize(self): 
     return "Hello World!" 
    __str__ = serialize 

foo = Foo() 
f = open("foo.dat", "wb") 
f.write(foo) 

Allerdings, wenn ich diesen Code ausführen, bekomme ich die folgende Ausnahme

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: argument 1 must be convertible to a buffer, not Foo 

Okay, also brauche ich meine Foo Klasse, um die buffer Schnittstelle zu implementieren. Ich sehe sogar in the buffer documentation, dass es sagt: "Ein Beispiel Benutzer der Pufferschnittstelle ist die write() Methode des Dateiobjekts. Jedes Objekt, das eine Reihe von Bytes durch die Pufferschnittstelle exportieren kann, kann in eine Datei geschrieben werden."

So kann ich anscheinend tun, was ich will, aber die Dokumente sagen nicht wirklich, welche Methoden ich implementieren muss, um die Pufferschnittstelle zu implementieren. Ich habe versucht, __str__, __unicode__, __len__ und sogar __sizeof__ zu implementieren. Ich habe __getitem__, __setitem__ und __delitem__ implementiert und sowohl int als auch slice Argumente akzeptiert. Ich habe sogar versucht, die veralteten Methoden __getslice__, __setslice__ und __delslice__ zu implementieren, nur um sicher zu sein. Egal was ich versuche, bekomme ich immer noch genau die selbe Ausnahme.

Als Referenz sind hier die Methoden der buffer builtin Klasse:

>>> dir(buffer) 
['__add__', '__class__', '__cmp__', '__delattr__', '__delitem__', '__delslice__', 
'__doc__', '__format__', '__getattribute__', '__getitem__', '__getslice__', 
'__hash__', '__init__', '__len__', '__mul__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__setitem__', 
'__setslice__', '__sizeof__', '__str__', '__subclasshook__'] 

Ich möchte alle von ihnen zu vermeiden, eins nach dem anderen die Umsetzung, und ich würde vor allem die Dokumentation gerne auf genau das finden welche Methoden sind notwendig.

Ist das etwas, das nur in C-Erweiterungsklassen implementiert werden kann? Oder fehlt mir etwas Offensichtliches?

Antwort

11

Besondere, gibt es keine speziellen Methoden, die eine reine Python-codierte Klasse direkt implementieren kann, um die buffer Schnittstelle zu unterstützen - das wäre PEP 298 gewesen, aber es wurde zurückgezogen.

Ich fürchte, du wirst einige expliziten Attribute oder Methode (oder über eine eingebaute in wie str, die intern ruft eine spezielle Methode) verwenden, um Ihre Klasse Instanzen file.write & c :-(passieren.

+0

Leider konnte ich, um dies zu bestätigen, nichts alleine finden, das explizit gesagt hat, dass Sie die Pufferschnittstelle in Python nicht implementieren können. –

1

Die Dokumentation sagt,

Python in C implementiert Objekte können eine Gruppe von Funktionen die „Puffer-Schnittstelle“ genannt. Exportieren

Ihre Foo Klasse nicht in C, umgesetzt wird, es...?

Verwandte Themen