我正在阅读有关python的新f字符串的 博客 ,它们看起来很整洁。但是,我希望能够从字符串或文件中加载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怎么办?我希望能够s像这样:
s
name = 'Fred' age = 42 s = "My name is {name} and I am {age} years old" effify(s)
事实证明,我已经可以执行类似的操作str.format并获得性能提高。即:
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'
f字符串是代码。不仅以安全的方式(当然,字符串文字就是代码),而且以危险的任意代码执行方式。这是有效的f字符串:
f"{__import__('os').system('install ransomware or something')}"
它将在评估时执行任意的shell命令。
您在问如何获取从文本文件加载的字符串并将其评估为代码,答案归结为eval。这当然是 安全隐患 , 可能不是一个好主意 ,因此,我建议不要尝试从文件中加载f字符串。
eval
如果f"My name is {name} and I am {age} years old"要从文件加载f字符串,则实际上
f"My name is {name} and I am {age} years old"
在文件中,f并用引号引起来。
f
从文件中读取它,对其进行编译并保存(因此eval不必每次都重新编译):
compiled_fstring = compile(fstring_from_file, '<fstring_from_file>', 'eval')
并使用eval:
formatted_output = eval(compiled_fstring)
如果这样做,请非常注意从中加载f字符串的来源。