Можно ли написать класс Python таким, чтобы его можно было передать в write ()? - PullRequest
0 голосов
/ 27 февраля 2019

Я хотел бы передать экземпляр моего класса в write () и записать его в файл.Базовые данные - это просто bytearray.

mine = MyClass()

with open('Test.txt', 'wb') as f:

    f.write(mine)

Я пытался реализовать __bytes__ безрезультатно.Мне известен буферный протокол, но я верю, что он может быть реализован только через C API (хотя я видел разговоры о делегировании базовому объекту, который реализовал протокол).

1 Ответ

0 голосов
/ 27 февраля 2019

Нет, вы не можете, нет никаких специальных методов, которые вы можете реализовать, чтобы ваш класс Python поддерживал буферный протокол.

Да, io.RawIOBase.write() и io.BufferedIOBase.write() методы документируют, что они принимают bytes -подобный объект , но буферный протокол должен был сделать чем-то bytes -подобным только протокол уровня C .Существует открытая проблема Python для добавления хитов Python , но никакого прогресса в этом направлении достигнуто не было.

Специальный метод __bytes__ вызывается только в том случае, если вы передали объект в вызываемую bytes();.write() не делает этого.

Таким образом, при записи в файл принимаются только фактические bytes -подобные объекты, все остальное должно быть сначала преобразовано в такой объект.Я бы придерживался:

with open('Test.txt', 'wb') as f:
    f.write(bytes(mine))

, который вызовет метод MyClass.__bytes__(), при условии, что он определен, или предоставит метод в вашем классе, который заставит его записать себя в объект файла:

with open('Test.txt', 'wb') as f:
    mine.dump(f)
...