如何将字符串转换为 f 字符串?

新手上路,请多包涵

我正在阅读这篇关于 Python 的新 f-strings博客文章,它们看起来非常简洁。但是,我希望能够从字符串或文件中加载 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'

原文由 piRSquared 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

f-strings 是代码。不仅以安全的方式,“字符串文字当然是代码”的方式,而且以危险的、任意代码执行的方式。这是一个有效的 f 字符串:

 f"{__import__('os').system('install ransomware or something')}"

并且它会在评估时执行任意 shell 命令。

您在询问如何获取从文本文件加载的字符串并将其作为代码进行评估,答案归结为 eval 。这当然是一个 安全风险 并且 可能是一个坏主意,所以我建议不要尝试从文件加载 f-strings。

如果你想从文件中加载 f-string f"My name is {name} and I am {age} years old" ,那么实际上把

f"My name is {name} and I am {age} years old"

在文件中, f 和引号等等。

从文件中读取它,编译它并保存它(所以 eval 不必每次都重新编译):

 compiled_fstring = compile(fstring_from_file, '<fstring_from_file>', 'eval')

并用 eval 评估它:

 formatted_output = eval(compiled_fstring)

如果这样做,请非常注意加载 f 弦的来源。

原文由 user2357112 发布,翻译遵循 CC BY-SA 3.0 许可协议

一个简单的解决方案是使用 f-strings 和 eval

 def effify(non_f_str: str):
    return eval(f'f"""{non_f_str}"""')

name = 'Fred'
age = 42
s = "My name is {name} and I am {age} years old"
effify(s)
'My name is Fred and I am 42 years old'

这基本上是在字符串前加上一个“f”,然后作为代码求值。三重引号也有助于容纳多行字符串。该函数将尝试从其调用周围的范围中提取 f 字符串中引用的变量。 正如所指出的,使用 eval 可能存在危险,但如果您知道您的来源,那么我认为它并不比执行任何其他代码更危险。

原文由 Jarno 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题