형식화 식에 딕셔너리를 사용하면 여러 형식 지정자에 같은 키를 지정할 수 있어서 같은 값을 반복하지 않아도 되므로 앞에서 설명한 세 번째 문제점도 해결할 수 있다.
name = '철수' template = '%s는 음식을 좋아해. %s가 요리하는 모습을 봐요.' before = template % (name, name) # 튜플 template = '%(name)s는 음식을 좋아해. %(name)s가 요리하는 모습을 봐요.' after = template % {'name': name} # 딕셔너리 assert before == after
하지만 딕셔너리 형식 문자열을 사용하면 다른 문제가 더 심해지거나 새로운 문제가 생긴다. 앞에서 설명한 두 번째 문제점인 값을 표시하기 전에 살짝 바꿔야 하는 경우, 형식화 연산자인 % 오른편에 딕셔너리 키와 콜론(:) 연산자가 추가됨에 따라 형식화 식이 더 길어지고 시각적으로 잡음이 더 많아진다. 다음 예제에서 이 문제점을 살펴보자. 같은 문자열을 형식화하면서 딕셔너리를 사용할 때와 사용하지 않을 때의 차이를 나타낸 것이다.
for i, (item, count) in enumerate(pantry): before = '#%d: %-10s = %d' % ( i + 1, item.title(), round(count)) after = '#%(loop)d: %(item)-10s = %(count)d' % { 'loop': i + 1, 'item': item.title(), 'count': round(count), } assert before == after