Форматирование строки может обрабатывать большинство ключей словаря строк просто отлично , но вам нужно удалить кавычки:
"the key is {d[key]}".format(d=d)
Демо:
>>> d = {'key': 'val'}
>>> "the key is {d[key]}".format(d=d)
'the key is val'
str.format()
синтаксис - это не то же самое, что синтаксис выражений Python (который в основном поддерживают f-строки).
из синтаксиса форматной строки документация :
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
[...]
element_index ::= digit+ | index_string
index_string ::= <any source character except "]"> +
и
[A] n выражение формы '[index]'
выполняет поиск по индексу, используя __getitem__()
Синтаксис ограничен, так как он преобразует любые строки, состоящие только из цифр, в целое число, а все остальное всегда интерпретируется как строка (хотя вы можете использовать вложенные {}
заполнители для динамической интерполяции значения ключа из другой переменной).
Если вы должны поддерживать произвольные выражения так же, как f-строки, и вы не берете строки шаблона из ненадежных источников (эта часть важна)тогда вы могли бы разобрать имя поля components , а затем используйте функцию eval()
для оценки значений перед тем, как выводить окончательную строку:
from string import Formatter
_conversions = {'a': ascii, 'r': repr, 's': str}
def evaluate_template_expressions(template, globals_=None):
if globals_ is None:
globals_ = globals()
result = []
parts = Formatter().parse(template)
for literal_text, field_name, format_spec, conversion in parts:
if literal_text:
result.append(literal_text)
if not field_name:
continue
value = eval(field_name, globals_)
if conversion:
value = _conversions[conversion](value)
if format_spec:
value = format(value, format_spec)
result.append(value)
return ''.join(result)
Теперь кавычки принимаются:
>>> s = "the key is {d['key']}"
>>> d = {'key': 'val'}
>>> evaluate_template_expressions(s)
'the key is val'
По сути, вы можете сделать то же самое с eval(f'f{s!r}', globals())
, но приведенное выше может дать вам больше контроля над выражениями, которые вы, возможно, захотите поддерживать.