Какие методы реализуют интерфейс буфера в Python?
У меня есть пользовательский класс с методом serialize
, и я хочу, чтобы иметь возможность писать этот класс непосредственно в файлы и получить возвращаемое значение метода serialize
в Python 2.6. (Я не пытаюсь pickle мои объекты, это совсем другое.) Например:
class Foo(object):
def serialize(self):
return "Hello World!"
__str__ = serialize
foo = Foo()
f = open("foo.dat", "wb")
f.write(foo)
Однако, когда я запускаю этот код, я получаю следующее исключение
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument 1 must be convertible to a buffer, not Foo
Хорошо, поэтому мне нужен класс Foo
для реализации интерфейса buffer
. Я даже вижу в документацию о буфере, в которой говорится: "Пример пользователя интерфейса буфера - это метод write() объектов объектов. Любой объект, которые могут экспортировать последовательность байтов через интерфейс буфера, могут быть записаны в файл."
Поэтому я могу делать то, что хочу, но документы фактически не говорят, какие методы мне нужно реализовать, чтобы реализовать интерфейс буфера. Я пробовал реализовать __str__
, __unicode__
, __len__
и даже __sizeof__
. Я реализовал __getitem__
, __setitem__
и __delitem__
, приняв аргументы int
и slice
. Я даже пытался реализовать устаревшие методы __getslice__
, __setslice__
и __delslice__
, чтобы быть в безопасности. Независимо от того, что я пытаюсь, я все равно получаю точно такое же исключение.
Для справки, здесь приведены методы встроенного класса 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__']
Я бы хотел, чтобы они не выполняли их все по одному, и мне особенно хотелось бы найти документацию о том, какие именно методы необходимы.
Это что-то, что может быть реализовано только в классах расширения C? Или я пропущу что-то очевидное?
Ответы
Ответ 1
В частности, нет специальных методов, которые класс с чистым Python-кодом мог бы реализовать непосредственно для поддержки интерфейса buffer
, который был бы PEP 298, но он был отозван.
Я боюсь, что вам придется использовать какой-то явный атрибут или метод (или встроенный, как str
, который внутренне вызывает специальный метод), чтобы передать экземпляры вашего класса в file.write
& c:-(.
Ответ 2
В документации говорится:
Объекты Python, реализованные в C, могут экспортировать группу функций, называемых "буферный интерфейс".
Ваш класс Foo не реализован в C, это...?