Я немного поиграл с вашим примером и нашел что-то сладкий ..
Во-первых: не используйте str()
для преобразования байт, то результат не то, что вы могли бы ожидать:
>>> str(b'abcd')
"b'abcd'"
Python просто ставит строковое представление входных байтов в какой-либо другой строки ,
Преобразовать так:
>>> b'abcd'.decode('utf-8')
'abcd'
Я написал несколько простой класс для имитации вашего msg
:
class Obj:
def __init__(self, **kwargs):
[setattr(self, k, v) for k, v in kwargs.items()]
msg = Obj(
content='some text',
author=Obj(
id='1337', name='some author'
),
channel=Obj(
server=Obj(name='localhost'),
name='#some_channel',
),
)
Второе: Создать логарифмическая функция которым принимает msg
объект и выводит информацию :
def log_msg(msg):
content = msg.content
return '''Message: \
{content} \
by {author_name} ({author_id}) \
@ {server_name} \
in {channel_name}'''.format(
content=content,
author_name=msg.author.name,
author_id=msg.author.id,
server_name=msg.channel.server.name,
channel_name=msg.channel.name,
)
Для построения выходной строки используется многострочная строка ''' ... '''
и str.format().
Теперь я могу сделать:
print(log_msg(msg))
>>> Message: some text by some author (1337) @ localhost in #some_channel
Теперь, если я использую данные примеры, что-то происходит:
msg.content = '\xe2\x9d\xa4'
print(log_msg(msg))
>>> Message: ⤠by some author (1337) @ localhost in #some_channel
Выглядит странно, но если вы посмотрите на кодовые где-то, все выглядит нормально:
\xe2; \x9d; \xa4
Но это не так, как мы имеем дело с байтами там:
msg.content = b'\xe2\x9d\xa4'
print(log_msg(msg))
>>> Message: b'\xe2\x9d\xa4' by some author (1337) @ localhost in #some_channel
Это тоже неправильно, мы получаем строковое представление входных байтов здесь.
ли преобразование перед печатью, так изменить начало функции журнала:
def log_msg(msg):
content = msg.content
if not isinstance(content, str):
content = content.decode('utf-8')
return '''Message: \
...
И посмотреть:
msg.content = b'\xe2\x9d\xa4'
print(log_msg(msg))
>>> Message: ❤ by some author (1337) @ localhost in #some_channel
Таким образом, не следует путать с типами данных (байт, ул) и не путайте порядок конвертации ... ❤
Пожалуйста, используйте фактический текст в своем вопросе, а не скриншоты текста. Вы можете отредактировать свой вопрос, чтобы удалить скриншоты и заменить их на фактический текст. – marcelm
исправил это, извините. – ImUniverseSE
Не пытайтесь кодировать строку, просто распечатайте ее напрямую. 'print' в Python 3 должен делать кодировку автоматически. Если это не так, это другая проблема. –