使用变量定义的f字符串

时间:2017-11-14 16:11:42

标签: python-3.x

通常我会使用string.format()将键值对插入到字符串模板中。新的Pep 498 f字符串已被推荐了一段时间,但它们似乎是这种行为的可怕选择。

例如,如果我想创建一个新的f_string,我需要先变量:

>>> date = 22
>>> date2 = f'this is a {date}'
>>> date2
'this is a 22'

现在,如果我尝试通过创建f-string模板执行相同操作但未初始化替换值,则会得到预期的NameError

>>> date_template = f'this is a new {date_new}'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'date_new' is not defined

由于无法将字符串转换为f-stringf-strings似乎主要是合成糖。是否有使用f-strings作为模板的非显而易见的方法,还是应该继续使用string.format()string.format_map()

1 个答案:

答案 0 :(得分:0)

目前,似乎没有比str.formatstr.format_map更好的方法了。

搜索Index of Python Enhancement Proposals后,我发现了这两个相关的PEP:PEP 501(通用字符串插值)和PEP 502(字符串插值-扩展讨论)。 PEP文档中的this note已延迟PEP 501:

  

该PEP目前正被推迟,以等待对PEP 498的更简单方法(仅支持急切渲染)的进一步体验,而又不支持延迟渲染。

我没有找到有关PEP 501未来计划的任何信息。


有一种方法可以绕过locals()提到的here的局限性。

在下面的示例中,调用f1时会抛出KeyError,因为locals()返回一个dict且所有变量位于f2范围内,其中不包含x

def f1():
    x = 4
    def f2():
        return 'x={x}'.format_map(locals())
    return f2()

当在函数中未使用在外部范围中定义的变量时,解释器不会在闭包中浪费包括该变量在内的资源。解释器无法确定x中实际上使用了f2 ,因为该用法是在字符串中指定的,其中解释器不检查变量的用法。由于x中似乎没有使用f2,因此当f1返回以节省内存时,它将被丢弃。

我们可以通过在x中显式使用f2来覆盖此行为。

def f1():
    x = 4
    def f2():
        x
        return 'x={x}'.format_map(locals())
    return f2()

注意:如果x中已经使用f2,则无需再次提及。例如:

def f1():
    x = 4
    def f2():
        print(x)
        return 'x={x}'.format_map(locals())
    return f2()

这里对print的调用(有点毫无意义)使用了x,因此无需在其他任何地方显式使用它。