【问题标题】:Use of variable defined f-strings使用变量定义的 f 字符串
【发布时间】:2018-04-27 16:06:23
【问题描述】:

我经常使用string.format() 将键值对插入到字符串模板中。新的Pep 498 f-strings 已经被推荐了一段时间,但对于这种行为来说,它们似乎是一个糟糕的选择。

例如,如果我想创建一个新的 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()

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

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

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

    此 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 实际上 isf2 中使用,因为该使用是在字符串中指定的,其中解释器不检查变量的使用情况。因为x似乎没有在f2中使用,所以当f1返回以节省内存时,它被丢弃。

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

    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,因此无需在其他任何地方显式使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-05
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多