4 回答

TA貢獻1802條經驗 獲得超5個贊
str()for與is forbytes相同,正是因為您最終不會濫用它。這是一個更復雜的示例,其中源字符串是表情符號。repr()bytes
>>> s = "??"
>>> len(s)
1 # One codepoint.
>>> b = s.encode("utf-8")
>>> len(b)
4 # Four bytes.
>>> print(b)
b'\xf0\x9f\x98\xb8' # Repr of the bytes, not to be interpreted.
>>> print(repr(b))
b'\xf0\x9f\x98\xb8' # Same as above!
>>> s2 = b.decode("utf-8") # Decode back to string from bytes.
>>> s == s2
True
>>>
也就是說,使用str.encode()從字符串中獲取字節,bytes.decode()從字節中獲取字符串。

TA貢獻1815條經驗 獲得超13個贊
您不是將其用作轉換函數(如在 C 和 C++ 中),而是將其用作值的str
字符串表示形式(要打印,因此它可能與 不同)。repr()
問題是二進制數組沒有好的可打印字符串,所以我假設沒有特定的str()
函數,所以它退回到repr()
,它添加了一些額外的注釋(對于開發人員),比如前綴b'
。
在不知道編碼的情況下,Python 無法將二進制數據轉換為字符串。(二進制編碼:在a
ASCII0x61
中,字符串被解碼:a
表示a
)。
所以你可能想要d.decode('utf-8')
。
注意:系統編碼是另一回事。它用于終端輸入和輸出,但不用于二進制數組,或從磁盤讀取的一般數據。

TA貢獻1812條經驗 獲得超5個贊
有沒有辦法讓 pylint 捕捉/警告這個問題
我認為 pylint 不會捕捉到它,但如果您愿意在代碼中添加類型注釋,mypy 會捕捉到它。
如果使用 flag 執行實例, Python 將在實例str上調用時發出警告。bytes-b
$ python3 -b -c 'str(b"a")'
-c:1: BytesWarning: str() on a bytes instance
請注意,警告只發出一次,AFAICT。
如果使用 執行-bb,將引發異常。
python3 -bb -c 'str(b"a")'
Traceback (most recent call last):
File "<string>", line 1, in <module>
BytesWarning: str() on a bytes instance

TA貢獻1863條經驗 獲得超2個贊
如果指定了編碼 [..],則對象必須公開一個數據緩沖區,該緩沖區將使用給定的編碼 [..] 進行解碼。
object.__str__()
否則,返回(如果已定義)或的結果repr(object)
。
這幾乎可以回答您的問題。如果您省略encoding
參數,則repr(object)
使用,這將導致"b'...'"
作為結果字符串值。如果您確實提供了encoding
參數,那么它將嘗試使用該編碼解碼提供的對象。這是兩個根本不同的操作:
生成對象的字符串表示形式,這是非常安全的,不會真的失敗。
解碼二進制對象,即嘗試以某種方式解釋其內容,這很可能會失敗。
這兩個操作由兩種不同的函數調用方式表示str
。當您只希望執行 #1 時,您不希望隱式觸發變體 #2 并有潛在的錯誤條件來處理一些隱式設置的全局值。
添加回答
舉報