2016-01-28 1 views
3

У меня есть функция, которая берет строку, отправляет ее через сокет и печатает ее на консоли. Отправка строк этой функции дает некоторые предупреждения, которые при попытке их исправления превращаются в другие предупреждения.Работа со строками кажется более громоздкой, чем должна быть в 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, так что это общепринятый способ выполнить это?

EDIT: Как объяснено ниже, ул не может иметь как decode и encode, и я путаю мой IDE, делая как на одной и той же переменной. Я исправил его, сохранив отдельную переменную для версии bytes, и это устраняет проблему.

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

ответ

10

В Python 2 вы могли бы быть очень коряво (а иногда и уйти с ним) при обработке символов (строк) и обработки байтов. Python 3 исправляет это, делая их двумя отдельными типами: str и bytes.

Вы закодировать конвертировать из strвbytes. Многие символы (в частности, не на английском/US-ASCII) требуют представления двух или более байтов (во многих кодировках).

Вы расшифровывает конвертировать из bytesвstr.

Таким образом, вы не можете декодировать a str. Вам нужно encode его распечатать или отправить его в любом месте, где требуются байты (файлы, сокеты и т. Д.). Вам также необходимо использовать правильное кодирование, чтобы получатель байтов мог правильно декодировать его и получить правильные символы. Для некоторых US-ASCII достаточно. Многие предпочитают использовать UTF-8, частично потому, что все символы, которые могут обрабатываться US-ASCII, одинаковы в UTF-8, но UTF-8 может обрабатывать (другие) символы Unicode.

+0

Благодарим за ясный и краткий ответ. –

0

Описание socket.send указывает, что оно принимает байты. Попробуйте кодировать строку в байтах как часть вашей функции log.

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

 Смежные вопросы

  • Нет связанных вопросов^_^