Как вариант, можно сделать список с нужными тебе ключами, в том порядке в котором ты добавляешь данные из своего словаря. В свой словарь тебе придется добавить 3 ключа для таких штук
" "
':\n'
'\n'
Я их назвал: space, next_one, next_two
new_msg= {'date': 3, 'space': ' ', 'from': None, "next_one": ':\n', 'text': 'there is some text', 'next_two': '\n', 'video': 'there is video'}
Дальше делаешь список с элементами, которые идентичны твоим ключам, в том порядке в котором ты собираешь сообщение
cycle_list = ['date', 'space', 'from', 'next_one', 'text', 'next_two', 'video']
Ну а дальше склеиваешь:
msg_to_send = ''.join([''+str(new_msg[i]) for i in cycle_list if new_msg[i]!=None])
Если что то вот эта строка - [''+str(new_msg[i]) for i in cycle_list if new_msg[i]!=None] имеет такой смысл:
К пустой строке добавь строковое представление ключа из словаря new_msg
Иди по списку cycle_list, если значение из словаря new_msg под ключем i не None, то его строковое представление прикрепи к пустой строке, в конце у тебя получается вот такой массив:
['3', ' ', ':\n', 'there is some text', '\n', 'there is video']
join собирает все элементы этого списка в одну строку, которая будет выглядеть вот так:
3 :
there is some text
there is video
Кстати, если нужно чтобы вместо None подставлялось другое значение, то просто реализуешь склеивание через переменную и добавляешь условие:
c = ''
msg_to_send = ''.join([c+str(new_msg[i]) if new_msg[i]!=None else c+"no data" for i in cycle_list])
Будет такой вывод:
3 no data:
there is some text
there is video
Думаю это костыльное решение, но должно работать)