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到这个流,这是一个错误,我希望它失败!有没有办法在不编写自己的StreamWriter的情况下实现这一点,该StreamWriter强制执行所写对象的类型?
另外,我不希望我的解决方案对sys.stdout.encoding
,sys.stdout.isatty()
,locale.getpreferredencoding()
,sys.getfilesystemencoding()
,os.environ["PYTHONIOENCODING"]
或其他任何方式敏感。我试图变得聪明。
答案 0 :(得分:3)
如果可能的话,做你在Python 3中尝试做的事情,它在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)