如何使python StreamWriter需要unicode输入?

如何使python StreamWriter需要unicode输入?,python,unicode,codec,Python,Unicode,Codec,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对象之外,还将删除unicode对象。如果我的程序正在

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对象之外,还将删除unicode对象。如果我的程序正在向这个流写入str,这是一个bug,我希望它失败!有没有一种方法可以在不编写自己的StreamWriter的情况下实现这一点,而StreamWriter强制执行所编写对象的类型


另外,我不希望我的解决方案对
sys.stdout.encoding
sys.stdout.isatty()
locale.getpreferredencoding()
sys.getfilesystemencoding()
os.Environment[“PYTHONIOENCODING”]
或python试图变得聪明的任何其他方式敏感。

如果可能,按照您在Python3中尝试执行的操作,Python3在unicode和字节之间有着更强的区别。否则,您将需要子类化
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)

为什么不能对输出字符串执行isinstance检查?或者,更好的方法是避免在程序中混合字节和unicode对象。我不想每次写入流时都手动添加isinstance检查。如果我可以“简单地避免”混合字节和unicode对象,那就太好了,但事实上,对于Python2来说,这很难做到。很多库,无论是标准库还是第三方库,都会使用您提供的unicode,但会传回一个str。这里的目标是快速失败,找出谁是坏角色,然后转换它们的返回值。建议使用Python 3,但给出的解决方案无法在Python3中工作,因为StreamWriter是一个空接口,并且stdout不再接受字节作为输入。是的。我提供了两种解决方案:使用Python3,或者“失败”子类StreamWriter。第二种解决方案只有在不能使用Python 3时才需要。