«окончательный» параметр не устанавливается в пользовательском IncrementalEncoder - PullRequest
0 голосов
/ 29 марта 2020

Для проекта, над которым я работаю, я хочу создать собственную кодировку текста, и для этого я использую модуль кодеков. Я создал инкрементальный кодировщик / декодер, но у меня возникли проблемы, потому что "final" параметр не устанавливается для метода IncrementalEncoder.encode при записи в файл с использованием этой кодировки. Мне интересно, это ошибка python или я что-то упускаю. Вот программа, которую я написал с бесполезной копией UTF-8, чтобы продемонстрировать проблему, которую я вижу:

import codecs

class MyIncrementalDecoder(codecs.IncrementalDecoder):

    def decode(self, obj, final=False):
        print('Bytes: ', obj)
        print('Final: ', final)
        return obj.decode('utf-8')

class MyIncrementalEncoder(codecs.IncrementalEncoder):

    def encode(self, obj, final=False):
        print('String: ', obj)
        print('Final: ', final)
        return obj.encode('utf-8')

my_utf_8 = codecs.CodecInfo(None, None, incrementaldecoder=MyIncrementalDecoder,
                            incrementalencoder=MyIncrementalEncoder)

def search(encoding_name):
    if encoding_name.replace('-', '').replace(' ', '').replace('_', '') == 'myutf8':
        return my_utf_8

codecs.register(search)

if __name__ == '__main__':
    print("Encoding...")
    with open(r'test.txt', 'w', encoding='myutf8') as file:
        file.write('Hello World!')
    print("Decoding...")
    with open(r'test.txt', 'r', encoding='myutf8') as file:
        print("File Text: ", file.read())

Это выводит следующее:

Encoding...
String:  Hello World!
Final:  False
Decoding...
Bytes:  b'Hello World!'
Final:  True
File Text:  Hello World!

Я считаю, что " final "должен быть установлен в True при вызове метода encode (или должен быть второй вызов с final = True), потому что я закрываю файл после кодирования текста, но это не так. Я что-то пропустил? Есть ли какой-нибудь способ «доработать» кодировку? Спасибо.

...