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

2024-05-15 01:46:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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'

Tags: and文件字符串nameformatagestringis
3条回答

But what if I had a string s? I want to be able to eff-ify s, something like this:

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

AFAIU,根据PEP 498 -- Literal String Interpolation,这是不可能的1。无法以编程方式创建f字符串:

In Python source code, an f-string is a literal string, prefixed with 'f', which contains expressions inside braces.


1当然,除非您愿意使用@coldspeed提到的exec之类的东西。但在这一点上,弊大于利。

一个简单的解决方案是使用f字符串和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可能会有潜在的危险,但如果您知道源代码,那么我认为它不会比执行任何其他代码更危险。

f字符串是代码。不仅仅是在保险箱中,“字符串文字当然就是代码”的方式,而是在危险的、任意的代码执行方式中。这是一个有效的f字符串:

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

在计算时,它将执行任意shell命令。

您正在询问如何从文本文件中获取一个字符串并将其作为代码进行计算,答案归结为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和引号以及所有。

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

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

并用eval进行评估:

formatted_output = eval(compiled_fstring)

如果你这样做了,就要非常小心你加载f字符串的来源。

相关问题 更多 >

    热门问题