通常我会使用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-string,f-strings
似乎主要是合成糖。是否有使用f-strings
作为模板的非显而易见的方法,还是应该继续使用string.format()
和string.format_map()
?
答案 0 :(得分:0)
str.format
和str.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
,因此无需在其他任何地方显式使用它。