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 并有潜在的错误条件来处理一些隐式设置的全局值。
添加回答
举报