每个人都喜欢Python 3.6的新f-strings:
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()
对getitem语法处理方式非常不同:In [39]: '{foo[blah]}'.format(**locals())
Out[39]: 'bang'
给定完整的Python表达式语法处理能力,f-strings非常棒,我喜欢它们。但是它们有一个问题:立即被评估了,然而使用
str.format()
可以将字符串与其格式保存为模板,在不同上下文中多次进行格式化。
那么,是否有一种等效的方法可以将字符串保存为模板,并在以后使用f-字符串语义进行评估?除了定义一个函数之外还有其他方法吗?是否有适用于f-字符串的等效方式类似于str.format()
?
更新:
因此,这里有一个假设接口示例:
In [40]: mystr = '{foo[bar]}'
In [41]: make_mine_fstring(mystr, foo=foo, bar=bar)
Out[41]: 'bang'