使用字符串似乎比Python 3.x中需要的更麻烦

时间:2016-01-28 16:54:33

标签: 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 " + 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不能同时具有decodeencode,并且我通过对同一个变量进行两者操作来混淆我的IDE。我通过为bytes版本维护一个单独的变量来修复它,这解决了这个问题。

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

2 个答案:

答案 0 :(得分:10)

在Python 2中,处理字符(字符串)和处理字节时,你可能会非常草率(有时会侥幸逃脱)。 Python 3通过将它们分为两种不同的类型来解决这个问题:strbytes

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

解码以从bytes 转换为 str

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

答案 1 :(得分:0)

socket.send描述表明它需要字节。尝试将字符串编码为字节,作为log函数的一部分。

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