Python中执行f-string的内部函数名称是什么?

3

我阅读了如何将字符串转换为f-string?如何延迟/推迟f-string的评估? 并看到许多(有效的)解决方案使用exec来推迟执行f-string,例如:

template = "My name is {name} and I am {age} years old"
name = 'Abcde'
age = 123
s = eval('f"""' + template + '"""')  # My name is Abcde and I am 123 years old

是否有一个内部的Python函数(在众多的双下划线__something__函数中),定义了解释器如何“运行” / “插值” f-string?

类似__runfstring__这样的东西,在Python源代码中负责执行代码吗?如果是这样,我们是否可以使用以下方式自己调用此函数:

s = __runfstring__(template)

在最新的Python版本中?(3.7或3.8+)


1
你使用f-strings的原因是什么?相比传统字符串格式化,例如直接调用template.format(name=name, age=age)有什么优势吗? - Tom Dalton
1
你可以将一个字典传递/解包到 .format 中,如果有帮助的话?我认为简短的答案可能是 f-strings 不适用于你的使用场景。 - Tom Dalton
通过调用函数来实现想要的操作的问题在于,局部变量不会存在于该函数中,它需要在调用范围内进行一些“令人惊讶”的变量发现工作。 - Tom Dalton
.format(**locals())? - Tom Dalton
我强烈建议不要在任何生产/敏感环境中使用它。 - Tom Dalton
显示剩余4条评论
1个回答

1
有没有Python内部函数(在许多双下划线__something__函数中)定义了解释器如何“运行”/“插值”f字符串 答案是否定的。PEP 498引入了f-strings,其中指出:
“未指定用于实现f-strings的确切代码。但是,保证将转换为字符串的任何嵌入式值都将使用该值的__format__方法。这与str.format()用于将值转换为字符串的机制相同。”
并且从Formatted string literals章节的Lexical Analysis文档中得知:
如果指定了转换,评估表达式结果前会进行转换。转换“!s”对结果调用str(),“!r”调用repr(),“!a”调用ascii()
然后使用format()协议格式化结果。格式化说明符传递给表达式或转换结果的__format__()方法。当省略格式说明符时,传递空字符串。格式化的结果随后包含在整个字符串的最终值中。
所以对于它们来说没有什么新内容可实现。它们是基于现有协议构建的。

但是我们在格式方面无法获取表达式评估阶段,因此我们无法使用非文字字符串重现相同的行为。 - GeePokey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接