Какие методы осуществляют буферный интерфейс в Пайтоне?

У меня есть таможенный класс с a serialize метод, и я хочу быть в состоянии написать этот класс непосредственно файлам и иметь возвращаемое значение serialize метод написан в Пайтоне 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 "", line 1, in 
TypeError: argument 1 must be convertible to a buffer, not Foo

Хорошо, таким образом, мне нужен мой Foo класс, чтобы осуществить buffer интерфейс. Я даже вижу в буферной документации, что она говорит: «Пользователь в качестве примера буферного интерфейса - объект файла, пишут () метод. Любой объект, который может экспортировать ряд байтов через буферный интерфейс, может быть написан файлу».

Так, по-видимому, я могу сделать то, что я хочу, но доктора на самом деле не говорят, какие методы я должен осуществить, чтобы осуществить буферный интерфейс. Я попытался осуществить __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? Или я пропускаю что-то очевидное?

13
задан Eli Courtwright 16 January 2010 в 23:08
поделиться

2 ответа

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

Я боюсь, что вам придется использовать некоторые явный атрибут или метод (или встроенный, как STR , который внутренне вызывает специальный метод), чтобы пройти экземпляры вашего класса на файл. Напишите & C :-(.

12
ответ дан 2 December 2019 в 00:46
поделиться

Документация говорит,

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

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

1
ответ дан 2 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: