Печать colors
после завершения цикла покажет вам
defaultdict(<function get_color at 0x7f6e7faed1e0>, {'name': '67C80A'})
, т.е. color
имеет только одну клавишу.Вы получаете доступ к colors['name']
с жестко закодированным ключом 'name'
, а не colors[name]
с динамическим именем.
Вам нужен еще один шаг форматирования.Один для создания шаблона, другой для вставки colors[name]
в шаблон.
import random
from collections import defaultdict
def get_color():
print('call')
return ''.join([random.choice('0123456789ABCDEF') for j in range(6)])
colors = defaultdict(get_color)
msg1 = {'name' : 'name1'}
msg2 = {'name' : 'name2'}
for msg in [msg1, msg2]:
msg_template = '{{colors[{name}]}} {{name}}'.format(**msg)
print(msg_template) # for demo purposes
msg = msg_template.format(colors=colors, **msg)
print(msg)
Вывод
{colors[name1]} {name}
call
A70B47 name1
{colors[name2]} {name}
call
55709A name2