kshnkvn
@kshnkvn
yay ✌️ t.me/kshnkvn

Как отправить только не None элементы?

Есть небольшой код, который берет нужные мне данные и пересылает их:
msg_to_send = new_msg['date'] + ' ' + new_msg['from'] + ':\n' + new_msg['text'] + '\n' + new_msg['video']
requests.post(send_message_ulr, data={'chat_id': '-351543550', 'text': msg_to_send})

Каждый из элементов может быть None. Можно-ли как-то их исключить? Громоздить код if-elif не очень хочу, думаю должно быть более "правильно" решение.
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
@dmtrrr
Backend developer
Dict Comprehension
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@bibliophile
Как вариант, можно сделать список с нужными тебе ключами, в том порядке в котором ты добавляешь данные из своего словаря. В свой словарь тебе придется добавить 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

Думаю это костыльное решение, но должно работать)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы