最近,我在__repr__()
,format()
和編碼方面遇到了很多麻煩。 __repr__()
的輸出是否應該被編碼或是一個unicode字符串? Python中的__repr__()
的結果是否有最好的編碼?我想要輸出的確有非ASCII字符。__repr __()函數的最佳輸出類型和編碼實踐?
我使用Python 2.x和要編寫能夠很容易地適應到Python 3代碼因此,本方案採用
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function # The 'Hello' literal represents a Unicode object
下面是已困擾了我一些額外的問題,而且我我想找的是解決他們的解決方案:
- 打印到UTF-8的終端應該工作(我有
sys.stdout.encoding
設置爲UTF-8
,但它是最好的,如果其他情況下,工作太)。 - 管道輸出到一個文件(UTF-8編碼)應該工作(在這種情況下,
sys.stdout.encoding
是None
)。 - 我的代碼很多
__repr__()
功能目前有很多return ….encode('utf-8')
,這很重。有沒有什麼健壯和輕量? - 在某些情況下,我甚至有醜陋的野獸,比如
return ('<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8')
,即對象的表示被解碼,放入一個格式化字符串,然後重新編碼。我想避免這種複雜的轉變。
對於編寫簡單的__repr__()
函數,您會建議如何處理這些編碼問題?
這將是很好,如果文檔提到這個:)(http://docs.python.org/reference/datamodel.html#basic-customization沒有)......反正......你會說問題中第4點的方法很繁瑣但是必要的,對嗎? – EOL 2010-09-02 14:11:54
EOL:假設Python2,'repr(x)'必須返回一個編碼字符串。如果它使用utf-8編碼,那麼'repr(x).decode('utf8')。encode('utf8')'不應該是必需的。 如果'repr(x)'使用其他編碼進行編碼,'repr(x).decode('utf8')'將會失敗(使用UnicodeDecodeError)或產生僞造結果,或者可能是幸運偶然正確解碼。因此,AFAIK,'repr(x).decode('utf8')。encode('utf8')' 應該永遠不需要。你能提供一個例子嗎? – unutbu 2010-09-02 14:23:09
@EOL,**返回值必須是一個字符串對象**是您指向的參考手冊頁如何表達返回值必須是「str」實例的約束條件(unicode對象不會是「a字符串對象「)。 'repr'通常只會返回ascii(所有unicode對象的'repr(uo)'的東西,例如:甚至_that_只返回ascii - 我認爲沒有內置或標準庫類型的行爲),但嚴格來說這不是語言限制,所以它不是參考手冊的業務。建議的文檔補丁總是歡迎,順便說一句! - ) – 2010-09-02 14:29:01