Как добавить в словарь элементы другого словаря в python3?
помогите плиз разобраться.. делаю бота с клавиатурой вконтакте. хочу сделать динамически обновляемую клавиатуру чтобы в зависимости от количества записей в бд появлялось ровно столько кнопок сколько и товаров. Но когда я делаю, то в логах вижу ошибку
TypeError: unsupported operand type(s) for +=: 'dict' and 'dict'
мой код ниже.
cursor.execute('select id_product FROM gxvg_inventory WHERE vk_id = (%s) ' + limit + '', (user))
res = cursor.fetchall()
# print(type(res))
if res:
keyboard = {}
for id_product in res:
keyboard += {
"inline": True,
"buttons": [
[{
"action": {
"type": "text",
"payload": id_product,
"label": "Использовать"
},
"color": "positive"
},
{
"action": {
"type": "text",
"payload": "{\"button\": \"12002\"}",
"label": "Положить"
},
"color": "primary"
},
{
"action": {
"type": "text",
"payload": json.dumps({'buttons': 12000 + 3}),
"label": "Продать"
},
"color": "negative"
}],
[{
"action": {
"type": "text",
"payload": json.dumps({'buttons': 12000 + 4}),
"label": "Далее >>"
},
"color": "secondary"
}]
]
}
print(keyboard)
keyboard = json.dumps(keyboard, ensure_ascii=False).encode('utf-8')
keyboard = str(keyboard.decode('utf-8'))
return keyboard
без цикла for клавиатура создается вот в таком виде
а мне необходимо сделать что-то подобное..
Третий день бьюсь с этой клавиатурой, и уже подумываю о том чтобы передавать элементы клавиатуры как-то статично, подставляя свои значения из базы данных, но это уже костыль..
я даже пытался объединять несколько заранее подготовленных словарей в один, но это кошмар.
Ответы (2 шт):
Когда вы пытаетесь добавить что-то в словарь, подразумевается, что это будет пара key : value, вы же пытаетесь передать в словарь другой словарь (который не может являться ключом).
Вам нужно не "складывать" словари, а добавлять новые кнопки в список, потом записать их по ключу "buttons":
buttons = []
for id_product in res:
# Добавить ряд кнопок
buttons.append([
{
"action": {
"type": "text",
"payload": id_product,
"label": "Использовать"
},
"color": "positive"
},
{
"action": {
"type": "text",
"payload": "{\"button\": \"12002\"}",
"label": "Положить"
},
"color": "primary"
},
{
"action": {
"type": "text",
"payload": json.dumps({'buttons': 12000 + 3}),
"label": "Продать"
},
"color": "negative"
}
])
# Добавить кнопку "далее" в самом конце после цикла
buttons.append([{
"action": {
"type": "text",
"payload": json.dumps({'buttons': 12000 + 4}),
"label": "Далее >>"
},
"color": "secondary"
}])
keyboard = {"inline": True, "buttons": buttons}
По поводу "сложения" словарей: можно обновлять данные словаря из другого словаря с помощью метода update, но при этом данные по одному и тому же ключу перезапишутся.
Нет такого специального "волшебного" метода, который понимал бы, что ключ-значение "inline": True не нужно трогать, а в список по ключу "buttons" нужно добавлять данные из другого словаря, а не перезаписывать.

