使用字符串似乎比 Python 3.x 中需要的更麻烦
Working with strings seems more cumbersome than it needs to be in Python 3.x
我有一个函数,它接收一个字符串,通过套接字发送它,并将它打印到控制台。向此函数发送字符串会产生一些警告,这些警告会在尝试修复它们时变成其他警告。
函数:
def log(socket, sock_message):
sock_message = sock_message.encode()
socket.send(sock_message)
print(sock_message.decode())
我正在尝试以这种方式调用我的函数:
log(conn, "BATT " + str(random.randint(1, 100)))
此外,为简单起见:
log(conn, "SIG: 100%")
通过两次 log
调用,我得到 Type 'str' doesn't have expected attribute 'decode'
。因此,相反,我看到您可以使用 bytes("my string", 'utf-8')
将字符串作为字节数组传递,但随后我收到警告 Type 'str' doesn't have expected attribute 'encode'
。
我 100% 确定我只是遗漏了一些关于如何在 python 中传递字符串的关键信息,那么实现此目的的公认方法是什么?
编辑:
如下所述,一个 str 不能同时具有 decode
和 encode
并且我在同一个变量上同时执行这两个操作而混淆了我的 IDE 。我通过为 bytes
版本维护一个单独的变量来修复它,这解决了问题。
def log(sock, msg):
sock_message = msg.encode()
sock.send(sock_message)
print(sock_message.msg())
在 Python 2 中,您在处理字符(字符串)和处理字节时可能会非常马虎(有时会侥幸逃脱)。 Python 3 通过使它们成为两个不同的类型来解决此问题:str
和 bytes
.
您编码以从str
转换为bytes
。许多字符(特别是非英语/US-ASCII 字符)需要两个或更多字节来表示它们(在许多编码中)。
你解码从bytes
转换成str
.
因此您无法解码 str
。您需要对其进行 编码 以打印它或将其发送到需要字节的任何地方(文件、套接字等)。您还需要使用正确的编码,以便字节的接收者可以正确解码并接收正确的字符。对于某些 US-ASCII 就足够了。许多人更喜欢使用 UTF-8,部分原因是 US-ASCII 可以处理的所有字符在 UTF-8 中都是相同的,但 UTF-8 可以处理(其他)Unicode 字符。
socket.send
说明说明是占用字节。尝试将字符串编码为字节作为 log
函数的一部分。
def log(socket, sock_message):
sock_bytes = bytes(sock_message, 'UTF-8')
socket.send(sock_bytes)
我有一个函数,它接收一个字符串,通过套接字发送它,并将它打印到控制台。向此函数发送字符串会产生一些警告,这些警告会在尝试修复它们时变成其他警告。
函数:
def log(socket, sock_message):
sock_message = sock_message.encode()
socket.send(sock_message)
print(sock_message.decode())
我正在尝试以这种方式调用我的函数:
log(conn, "BATT " + str(random.randint(1, 100)))
此外,为简单起见:
log(conn, "SIG: 100%")
通过两次 log
调用,我得到 Type 'str' doesn't have expected attribute 'decode'
。因此,相反,我看到您可以使用 bytes("my string", 'utf-8')
将字符串作为字节数组传递,但随后我收到警告 Type 'str' doesn't have expected attribute 'encode'
。
我 100% 确定我只是遗漏了一些关于如何在 python 中传递字符串的关键信息,那么实现此目的的公认方法是什么?
编辑:
如下所述,一个 str 不能同时具有 decode
和 encode
并且我在同一个变量上同时执行这两个操作而混淆了我的 IDE 。我通过为 bytes
版本维护一个单独的变量来修复它,这解决了问题。
def log(sock, msg):
sock_message = msg.encode()
sock.send(sock_message)
print(sock_message.msg())
在 Python 2 中,您在处理字符(字符串)和处理字节时可能会非常马虎(有时会侥幸逃脱)。 Python 3 通过使它们成为两个不同的类型来解决此问题:str
和 bytes
.
您编码以从str
转换为bytes
。许多字符(特别是非英语/US-ASCII 字符)需要两个或更多字节来表示它们(在许多编码中)。
你解码从bytes
转换成str
.
因此您无法解码 str
。您需要对其进行 编码 以打印它或将其发送到需要字节的任何地方(文件、套接字等)。您还需要使用正确的编码,以便字节的接收者可以正确解码并接收正确的字符。对于某些 US-ASCII 就足够了。许多人更喜欢使用 UTF-8,部分原因是 US-ASCII 可以处理的所有字符在 UTF-8 中都是相同的,但 UTF-8 可以处理(其他)Unicode 字符。
socket.send
说明说明是占用字节。尝试将字符串编码为字节作为 log
函数的一部分。
def log(socket, sock_message):
sock_bytes = bytes(sock_message, 'UTF-8')
socket.send(sock_bytes)