2010-01-16 11 views
13

Tengo una clase personalizada con un método serialize, y quiero poder escribir esta clase directamente en los archivos y obtener el valor devuelto del método serialize escrito, en Python 2.6. (No estoy tratando de pickle mis objetos, esto es algo totalmente diferente.) Por ejemplo:¿Qué métodos implementan la interfaz del búfer en Python?

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

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

Sin embargo, cuando ejecuta este código, me sale el siguiente excepción

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

bien, entonces necesito mi clase Foo para implementar la interfaz buffer. Incluso veo en the buffer documentation que dice: "Un usuario de ejemplo de la interfaz del búfer es el método write() del objeto de archivo. Cualquier objeto que pueda exportar una serie de bytes a través de la interfaz del búfer puede escribirse en un archivo".

Parece que puedo hacer lo que quiero, pero los documentos no dicen qué métodos necesito implementar para poder implementar la interfaz del buffer. Intenté implementar __str__, __unicode__, __len__ e incluso __sizeof__. Implementé __getitem__, __setitem__ y __delitem__, aceptando los argumentos int y slice. Incluso he intentado implementar los métodos obsoletos __getslice__, __setslice__ y __delslice__ para estar seguro. No importa lo que intente, todavía obtengo exactamente la misma excepción.

Como referencia, aquí están los métodos de la clase incorporada buffer:

>>> 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__'] 

que me gustaría evitar la aplicación de todos ellos, uno por uno, y sobre todo me gustaría encontrar la documentación sobre exactamente qué métodos son necesarios

¿Es esto algo que solo se puede implementar en las clases de extensión C? ¿O me estoy perdiendo algo obvio?

Respuesta

11

Curiosamente, no hay métodos especiales que una clase codificada de Python puro pueda implementar directamente para admitir la interfaz buffer, que habría sido PEP 298, pero se retiró.

Me temo que tendrá que utilizar algún atributo o método explícito (o un sistema incorporado en str como el que llama internamente un método especial) pase a instancias de su clase a file.write & c :-(.

+0

Por desgracia, gracias por confirmar esto, no pude encontrar nada por mi cuenta que explícitamente dijera que no se puede implementar la interfaz de búfer en Python. –

1

La documentación dice,

Python objetos implementados en C puede exportar un grupo de funciones de llamada “interfaz de buffer.”

Su clase Foo no está implementado en C, es eso...?

Cuestiones relacionadas