【发布时间】:2017-10-10 19:28:12
【问题描述】:
每个人都喜欢 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-strings 非常棒,我喜欢它们。但它们有一个问题:它们会立即被评估,而使用 str.format() 我可以将带有格式的字符串保存为模板,并在不同的上下文中多次格式化。
那么,有没有一种等效的方法可以将字符串保存为模板,并在以后使用 f-string 语义对其进行评估?除了定义一个函数? f-strings 是否有与 str.format() 等效的方法?
更新:
所以,这里以假设的界面为例:
In [40]: mystr = '{foo[bar]}'
In [41]: make_mine_fstring(mystr, foo=foo, bar=bar)
Out[41]: 'bang'
【问题讨论】:
-
为什么除了定义一个函数之外还需要其他东西?这是一种显而易见的方法。
-
好吧,假设我正在从文件中读取字符串。如何从中获取 f-string 语义?
-
这与从文件中读取任意可执行代码并执行它基本相同。大多数情况下是个坏主意。
-
@kindall 我想 Guido 在编写 Python 解释器之前应该考虑到这一点。 ;)