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 не очень хочу, думаю должно быть более "правильно" решение.
  • Вопрос задан
  • 58 просмотров
Решения вопроса 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

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

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

Войти через центр авторизации
Похожие вопросы