gpt4 book ai didi

python - 是否有与 f-string 语法等效的可调用函数?

转载 作者:太空狗 更新时间:2023-10-30 01:11:54 25 4
gpt4 key购买 nike

人人都喜欢 Python 3.6 的新 f 字符串:

In [33]: foo = {'blah': 'bang'}

In [34]: bar = 'blah'

In [35]: f'{foo[bar]}'
Out[35]: 'bang'

然而,虽然在功能上非常相似,但它们与 str.format() 的语义并不完全相同:

In [36]: '{foo[bar]}'.format(**locals())
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-36-b7ef5aead76c> in <module>()
----> 1 '{foo[bar]}'.format(**locals())

KeyError: 'bar'

特别是,str.format() handles getitem syntax very differently :

In [39]: '{foo[blah]}'.format(**locals())
Out[39]: 'bang'

鉴于能够处理成熟的 Python 表达式语法,f 字符串非常棒,我喜欢它们。但它们有一个障碍:它们会立即被评估,而使用 str.format() 我可以将字符串及其格式保存为模板,并在不同的上下文中对其进行多次格式化。

那么,有没有一种等效的方法可以将字符串保存为模板,并在以后使用 f-string 语义对其进行评估?除了定义一个函数?是否有等同于 str.format() 的 f 字符串?

更新:

所以,这里以假设的界面为例:

In [40]: mystr = '{foo[bar]}'

In [41]: make_mine_fstring(mystr, foo=foo, bar=bar)
Out[41]: 'bang'

最佳答案

简短的回答:没有。

您可以阅读 PEP-498关于这些 f 弦。它清楚地定义了它们的目的和概念:这些字符串是就地求值的。结果是带有格式化内容的普通 str。您不能将 f 字符串存储为模板,因为没有用于 f 字符串的特殊对象。

PEP-498 的“Differences between f-string and str.format expressions”部分中也提到了您的具体示例。

因此,无论您做什么,您要么使用内联就地 f 字符串,要么使用具有不同行为的旧 s.format() 语法。

如果你想从文件中读取一个 f-string 并根据 f-strings 的语法对其进行评估,你可以使用 eval:

foo = {'blah': 'bang', 'bar': 'sorry'}
bar = 'blah'

tpl = '{foo[bar]}'
print(tpl)

print(tpl.format(**locals())) # sorry
print(eval(f'f{tpl!r}')) # bang

请注意我们如何首先使用 f 字符串,但将 tpl 转换为它自己的 repr 以便立即评估。通常,对于简单类型,eval(repr(val)) 应该返回 val。但是,我们不是只放入 repr(tpl)(或 {tpl!r}),而是将常规字符串的 repr 转换为 f -string,并对其求值。

关于python - 是否有与 f-string 语法等效的可调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com