使用字符串似乎比在Python3.x中更麻烦

使用字符串似乎比在Python3.x中更麻烦,python,string,python-3.x,bytearray,Python,String,Python 3.x,Bytearray,我有一个函数,它接收字符串,通过套接字发送,然后打印到控制台。将字符串发送到此函数会产生一些警告,当尝试修复这些警告时,这些警告会变成其他警告 功能: def log(socket, sock_message): sock_message = sock_message.encode() socket.send(sock_message) print(sock_message.decode()) 我正试图以这种方式调用我的函数: log(conn, "BATT " + s

我有一个函数,它接收字符串,通过套接字发送,然后打印到控制台。将字符串发送到此函数会产生一些警告,当尝试修复这些警告时,这些警告会变成其他警告

功能:

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
调用,我得到的
类型“str”没有预期的属性“decode”
。因此,我看到可以通过
字节(“我的字符串”,“utf-8”)
将字符串作为字节数组传递,但随后我得到警告
类型“str”没有预期的属性“encode”

我百分之百肯定我只是缺少了一些关于如何在python中传递字符串的关键信息,那么一般公认的实现方法是什么呢

编辑: 如下所述,str不能同时具有
decode
encode
,而且我在同一个变量上同时执行这两项操作会混淆我的IDE。我通过为
字节
版本维护一个单独的变量来修复它,这就解决了这个问题

def log(sock, msg):
    sock_message = msg.encode()
    sock.send(sock_message)
    print(sock_message.msg())

在Python2中,在处理字符(字符串)和字节时,您可能会非常草率(有时会得逞)。Python3通过将它们分成两种不同的类型来解决这个问题:
str
bytes

您可以编码
str
转换为
字节
。许多字符(特别是非英语/US-ASCII字符)需要两个或更多字节来表示它们(在许多编码中)

您可以解码
字节
转换为
str


因此,您无法解码
str
。您需要对其进行编码以打印或将其发送到需要字节的任何位置(文件、套接字等)。您还需要使用正确的编码,以便字节的接收器能够正确解码并接收正确的字符。对于某些US-ASCII就足够了。许多人更喜欢使用UTF-8,部分原因是US-ASCII可以处理的所有字符在UTF-8中都是相同的,但UTF-8可以处理(其他)Unicode字符。

套接字。发送说明表明它需要字节。尝试将字符串编码为字节,作为
log
函数的一部分

def log(socket, sock_message):
    sock_bytes = bytes(sock_message, 'UTF-8')
    socket.send(sock_bytes)