Python 3 TypeError: Невозможно неявно преобразовать «байтовый» объект в str

Python 3 TypeError: не может неявно преобразовать «байтовый» объект в str

Преобразование примера сокета Python 2 в Python 3

whois.py

import sys
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("whois.arin.net", 43))
s.send((sys.argv[1] + "\r\n").encode())

response = ""
while True:
    data = s.recv(4096)
    response += data
    if not data:
        break
s.close()
print(response)

Если скомпилировать с Python 3, он выдаст следующую ошибку?

Traceback (most recent call last):
  File "C:\repos\hc\whois\python\whois.py", line 12, in 
    response += data
TypeError: Can't convert 'bytes' object to str implicitly

Решение

В Python 3 сокет возвращает данные какbytes (в Python 2 это былоstring). Поскольку ответ представляет собойstring, вы не можете напрямую добавить два разных типа (bytes + string). To fix it, вам нужно преобразовать тип:

# Решение 1 Преобразовать ответ изstring to bytes

whois.py

import sys
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("whois.arin.net", 43))
s.send((sys.argv[1] + "\r\n").encode())

#Convert response to bytes
response = b""
# or use encode()
#response = "".encode()

while True:
    data = s.recv(4096)
    response += data
    if not data:
        break
s.close()
print(response.decode())

# Решение 2 Преобразование данных изbytes to string

whois.py

import sys
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("whois.arin.net", 43))
s.send((sys.argv[1] + "\r\n").encode())

response = ""
while True:
    data = s.recv(4096)
    #convert data from bytes to string
    #response += data
    response += data.decode()
    if not data:
        break
s.close()
print(response)