str.format
имеет дело с текстом, заключенным в фигурные скобки {}
.Здесь переменная CREDENTIALS
имеет начальную букву в виде фигурных скобок {
, которая следует правилу str.format
, чтобы заменить его текст и найти непосредственно закрывающие фигурные скобки, поскольку она не находит его, а вместо этого получает еще одну открывающую фигурную скобку '{', поэтому онавыдает ошибку.
Строка, для которой вызывается этот метод, может содержать буквенный текст или поля замены, разделенные фигурными скобками {}
Теперь для экранирования фигурных скобок и замены только которыес отступом можно сделать, если заключить его в два раза, например
'{{ Hey Escape }} {0}'.format(12) # O/P '{ Hey Escape } 12'
Если вы избежите родительского и прародительского {}
, то это будет работать.
Пример:
'{{Escape Me {n} }}'.format(n='Yes') # {Escape Me Yes}
ТакСледуя правилу str.format
, я избегаю родительского текста, заключенного в фигурные скобки, добавив одну дополнительную фигурную скобку, чтобы избежать его.
"{{\"aaaUser\": {{\"attributes\": {{\"pwd\": \"{0}\", \"name\": \"{1}\"}}}}}}".format('password', 'username')
#O/P '{"aaaUser": {"attributes": {"pwd": "password", "name": "username"}}}'
Теперь перейдем к форматированию строки, чтобы оно работало.Есть другой способ сделать это.Однако это не рекомендуется в вашем случае, так как вам нужно убедиться, что проблема всегда имеет формат, как вы упомянули, и никогда не связываться с другим, иначе результат может резко измениться.
Итак, здесь используется решение, которому я следуюстрока заменяет, чтобы преобразовать формат из {0}
в %(0)s
, чтобы форматирование строки работало без проблем и никогда не заботилось о фигурных скобках.
'Hello %(0)s' % {'0': 'World'} # Hello World
Так что здесь я использую re.sub
, чтобы заменить все вхождения
def myReplace(obj):
found = obj.group(0)
if found:
found = found.replace('{', '%(')
found = found.replace('}', ')s')
return found
CREDENTIALS = re.sub('\{\d{1}\}', myReplace, "{\"aaaUser\": {\"attributes\": {\"pwd\": \"{0}\", \"name\": \"{1}\"}}}"% {'0': 'password', '1': 'username'}
print CREDENTIALS # It should print desirable result