2011-10-12 28 views
2

python編解碼器模塊提供StreamWriter類來透明地編碼輸出流。例如:如何製作一個Python StreamWriter REQUIRE unicode輸入?

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

但是我有一個默認的StreamWriter的問題是,它會除外海峽對象和Unicode對象。如果我的程序正在爲此流寫入一個str,這是一個錯誤,我希望它失敗!有沒有辦法讓這種情況發生,而無需編寫自己的強制寫入對象類型的StreamWriter?

而且,我不希望我的解決辦法是敏感sys.stdout.encodingsys.stdout.isatty()locale.getpreferredencoding()sys.getfilesystemencoding()os.environ["PYTHONIOENCODING"]或任何其他方式蟒蛇有巧言令色。

+0

爲什麼你不能只是做對輸出字符串的isinstance檢查?或者更好的是,避免在程序中混合字節和unicode對象。 – ekhumoro

+0

我不想在每次寫入流時手動添加isinstance檢查。如果我可以「簡單地避免」混合字節和unicode對象,那將是非常好的,但事實是在python 2中這很難。標準庫和第三方庫中的很多庫將採用你給他們的unicode,但是通過一個str。這裏的目標是快速失敗,找出誰是壞角色,然後轉換他們的回報。 – Nick

回答

3

如果可能的話,在Python 3中執行你想要做的事情,它在unicode和bytes之間有着更強的區別。如果做不到這一點,你需要繼承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) 
+0

建議使用Python 3,但由於StreamWritter是一個空接口,並且stdout不再接受字節作爲輸入,所以給出的解決方案無法在Python 3中工作。 –

+0

是的。我提供了兩種解決方案:使用Python 3,或'失敗'的子類StreamWriter。第二種解決方案只有在您不能使用Python 3時才需要。 –

+0

我的不好,很抱歉.. –

相關問題