Как преобразовать строку в f-строку
Я читал это блог на новых f-строках python, и они кажутся очень аккуратными. Однако я хочу иметь возможность загружать f-строку из строки или файла.
Я не могу найти какой-либо строковый метод или другую функцию, которая делает это.
из примера в моей ссылке выше:
name = 'Fred'
age = 42
f"My name is {name} and I am {age} years old"
'My name is Fred and I am 42 years old'
но что, если бы у меня была строка s
? Я хочу иметь возможность eff-ify s
, что-то вроде это:
name = 'Fred'
age = 42
s = "My name is {name} and I am {age} years old"
effify(s)
оказывается, я уже могу выполнить что-то подобное str.format
и набрать производительность забрать. А именно:
format = lambda name, age: f"My name is {name} and I am {age} years old"
format('Ted', 12)
'My name is Ted and I am 12 years old'
2 ответов
f-строки являются кодом. Не только в безопасном," конечно, строковый литерал-это код", но и в опасном, произвольном исполнении кода. Это допустимая f-строка:
f"{__import__('os').system('install ransomware or something')}"
и он будет выполнять произвольные команды оболочки, когда оценивали.
вы спрашиваете, как взять строку, загруженную из текстового файла, и оценить ее как код, и ответ сводится к eval
. Это конечно угрозу безопасности и наверное, плохая идея, поэтому я рекомендую не пытаться загружать f-строки из файлов.
если вы хотите загрузить f-строку f"My name is {name} and I am {age} years old"
из файла, то фактически поставить
f"My name is {name} and I am {age} years old"
в файле f
и кавычки и все.
прочитайте его из файла, скомпилируйте его и сохраните (so eval
не нужно перекомпилировать каждый раз):
compiled_fstring = compile(fstring_from_file, '<fstring_from_file>', 'eval')
и оценить его с eval
:
formatted_output = eval(compiled_fstring)
если вы это сделаете, будьте очень осторожны с источниками, которые вы загружаете f-струны от.
но что, если бы у меня была строка s? Я хочу иметь возможность eff-ify s, что-то вроде этого:
name = 'Fred' age = 42 s = "My name is {name} and I am {age} years old" effify(s)
AFAIU, согласно PEP 498 -- Литеральная строковая интерполяция, это невозможно1. Невозможно программно создать f-строку:
в исходном коде Python,f-строка-это литеральная строка с префиксом 'f', которая содержит выражения внутри брекеты.
1если, конечно, вы захотите использовать что-то вроде exec
Как упоминалось в @coldspeed. Но в этот момент минусы перевешивают плюсы.