Какие методы реализуют интерфейс буфера в Python? - PullRequest
13 голосов
/ 17 января 2010

У меня есть собственный класс с методом serialize, и я хочу иметь возможность записать этот класс непосредственно в файлы и получить возвращаемое значение метода serialize в Python 2.6. (Я не пытаюсь засолить мои объекты, это что-то совершенно другое.) Например:

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? Или я что-то упускаю очевидное?

Ответы [ 2 ]

12 голосов
/ 17 января 2010

В частности, не существует специальных методов, которые класс с чистым Python может напрямую реализовать для поддержки интерфейса buffer - это было бы PEP 298 , но оно было отозвано.

Боюсь, вам придется использовать какой-либо явный атрибут или метод (или встроенный метод, например str, который внутренне вызывает специальный метод), чтобы передать экземпляры вашего класса в file.write & c: - (.

1 голос
/ 17 января 2010

В документации написано,

Объекты Python, реализованные в C, могут экспортировать группу функций, называемых «Буферный интерфейс».

Ваш класс Foo не реализован в C, не так ли? ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...