【问题标题】:String with 'f' prefix in python-3.6python-3.6中带有'f'前缀的字符串
【发布时间】:2016-06-15 04:16:03
【问题描述】:

我正在试用 Python 3.6。在浏览新代码时,我偶然发现了这种新语法:

f"My formatting string!"

看来我们可以这样做:

>>> name = "George"
>>> print(f"My cool string is called {name}.")
My cool string is called George.

任何人都可以阐明其内部工作原理吗?特别是 f 前缀字符串可以采用的变量范围是什么?

【问题讨论】:

    标签: python scope string-formatting python-3.6 f-string


    【解决方案1】:

    PEP 498 Literal String Interpolation:

    从字符串中提取的表达式在 f 字符串出现的上下文中进行评估。这意味着表达式可以完全访问局部和全局变量。可以使用任何有效的 Python 表达式,包括函数和方法调用。

    因此,表达式被评估为好像它们出现在相同的范围内;局部变量、闭包和全局变量的工作方式与同一上下文中的其他代码相同。

    您可以在reference documentation 中找到更多详细信息:

    格式化字符串文字中的表达式被视为用括号括起来的常规 Python 表达式,但有一些例外。不允许使用空表达式,lambda 表达式必须用显式括号括起来。替换表达式可以包含换行符(例如在三引号字符串中),但它们不能包含 cmets。每个表达式都在格式化字符串文字出现的上下文中进行评估,从左到右。

    由于您正在尝试 3.6 alpha 版本,请务必阅读What's New In Python 3.6 documentation。它总结了所有更改,包括相关文档和 PEP 的链接。

    需要明确一点:3.6 尚未发布;第一个 Alpha 版预计要到 2016 年 5 月才会发布。请参阅3.6 release schedule

    【讨论】:

    • 是否预期 f 字符串将被反向移植到以前版本的 python3(如果他们发现新代码中大量使用)?无论哪种方式,我都无法找到答案,但这似乎是一个争论点。
    • 没有计划向后移植这个,没有。 PEP 声明这是 3.6 的新功能。
    • 谢谢。我试图将它与 Enum PEP 进行比较,它是新的,但最终向后移植到以前的 3.x 版本,我没有看到任何表明计划的任何东西。
    • @ChrisArena:枚举功能是纯代码;它可以作为可安装的附加组件向后移植到以前的 Python 版本,因此较旧的 Python 版本不需要新版本。 f 字符串是 syntax,改变了 Python 本身的工作方式。您不能将语法作为附加组件进行反向移植。
    • @JürgenA.Erhard:当然,它支持任何有效的表达式
    【解决方案2】:

    f-strings 还支持大括号内的任何 Python 表达式。

    print(f"My cool string is called {name.upper()}.")
    

    【讨论】:

      【解决方案3】:

      还可能值得注意的是,此 PEP498 向后移植到 Python

      pip install fstring

      from fstring import fstring
      
      x = 1
      
      y = 2.0
      
      plus_result = "3.0"
      
      print fstring("{x}+{y}={plus_result}")
      
      # Prints: 1+2.0=3.0
      

      【讨论】:

        【解决方案4】:

        字母 f 表示“格式”,如 f"hello {somevar}。"(双引号)和 {} 字符之前的这个小 f 告诉 python 3,“嘿,这个字符串需要格式化。所以把这些变量在那里并格式化。”。

        希望这很清楚。

        【讨论】:

          猜你喜欢
          • 2021-03-25
          • 2017-04-29
          • 2016-03-24
          • 1970-01-01
          • 1970-01-01
          • 2015-04-28
          • 1970-01-01
          • 2022-06-10
          • 1970-01-01
          相关资源
          最近更新 更多