我在python的新f-string上读到这个blog,它们看起来非常整洁。但是,我希望能够从字符串或文件加载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
生效,如下所示:
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'
AFAIU,根据PEP 498 -- Literal String Interpolation,这是不可能的1。无法以编程方式创建f字符串:
1当然,除非您愿意使用@coldspeed提到的
exec
之类的东西。但在这一点上,弊大于利。一个简单的解决方案是使用f字符串和eval。
这基本上是在字符串前面加上一个“f”,然后作为代码计算。三重引号也有助于容纳多行字符串。函数将尝试从其调用周围的作用域中提取f字符串中引用的变量。如前所述,使用
eval
可能会有潜在的危险,但如果您知道源代码,那么我认为它不会比执行任何其他代码更危险。f字符串是代码。不仅仅是在保险箱中,“字符串文字当然就是代码”的方式,而是在危险的、任意的代码执行方式中。这是一个有效的f字符串:
在计算时,它将执行任意shell命令。
您正在询问如何从文本文件中获取一个字符串并将其作为代码进行计算,答案归结为
eval
。这当然是一个安全风险和可能是个坏主意,因此我建议不要尝试从文件加载f字符串。如果要从文件加载f字符串
f"My name is {name} and I am {age} years old"
,那么实际上在文件中,
f
和引号以及所有。从文件中读取它,编译并保存它(因此
eval
不必每次都重新编译它):并用
eval
进行评估:如果你这样做了,就要非常小心你加载f字符串的来源。
相关问题 更多 >
编程相关推荐