Как я могу сделать Python StreamWriter REQUIRE ввод Unicode? - PullRequest
2 голосов
/ 13 октября 2011

Модуль кодеков Python предоставляет классы StreamWriter для прозрачного кодирования выходных потоков. Например:

outstream = codecs.getwriter('utf8')(sys.__stdout__)
outstream.write(u'\u2713')
outstream.write(' A-OK!\n') # I want this to fail!
outstream.close()

Однако проблема с StreamWriter по умолчанию заключается в том, что он будет исключать как объекты str, так и объекты Юникода. Если моя программа записывает str в этот поток, это ошибка, и я хочу, чтобы она не сработала! Есть ли способ сделать это без написания моего собственного StreamWriter, который обеспечивает тип написанных объектов?

Кроме того, я не хочу, чтобы мое решение было чувствительным к sys.stdout.encoding, sys.stdout.isatty(), locale.getpreferredencoding(), sys.getfilesystemencoding(), os.environ["PYTHONIOENCODING"] или любым другим способам, которыми питон пытается быть умным.

1 Ответ

3 голосов
/ 13 октября 2011

Если возможно, делайте то, что вы пытаетесь сделать в Python 3, который имеет гораздо более сильное различие между юникодом и байтами.В противном случае вам нужно будет создать подкласс StreamWriter, например:

import codecs

class StrictUTF8Writer(codecs.StreamWriter):
    '''A StreamWriter for utf8 that requires written objects be unicode'''
    encode = codecs.utf_8_encode

    def write(self, object):
        if not isinstance(object, unicode):
            raise ValueError('write() requires unicode object')
        return codecs.StreamWriter.write(self, object)
...