代码之家  ›  专栏  ›  技术社区  ›  jmd_dk

为什么不能在f字符串中使用反斜杠?

  •  3
  • jmd_dk  · 技术社区  · 6 年前

    在Python>=3.6中,f字符串可以用作 str.format 方法。举个简单的例子,它们是等价的:

    '{} {}'.format(2+2, "hey")
    f'{2+2} {"hey"}'
    

    无视 format specifiers ,我基本上可以移动 str.格式 f字串中的内括号。请特别注意,我被允许 str 这里的文字,虽然看起来有点笨拙。

    但是也有一些限制。明确地, backslashes in any shape or form 不允许出现在f字符串的大括号内:

    '{}'.format("new\nline")  # legal
    f'{"new\nline"}'          # illegal
    f'{"\\"}'                 # illegal
    

    我甚至不能用 \ 如果是在牙套里面,就把一条长线分开;

    f'{2+\
    2}'     # illegal
    

    即使这种用法 \ 完全允许在正常范围内 str公司 的;

    '{\
    }'.format(2+2)  # legal
    

    在我看来,如果解析器看到 \ f字符串大括号内的字符。为什么要实施这一限制?尽管 docs 指定此行为,则无法证明原因。

    1 回复  |  直到 6 年前
        1
  •  8
  •   user2357112    6 年前

    你好像在期待

    '{}'.format("new\nline")
    

    f'{"new\nline"}'
    

    相当于。这不是我所期望的,也不是f字符串中的反斜杠在Python 3.6的预发行版本中是如何工作的,在python3.6中,大括号之间的反斜杠是允许的。那时候,你会得到一个错误,因为

    "new
    line"
    

    不是有效的Python表达式。

    如前所述,大括号中的反斜杠是混乱和不明确的,它们是 banned 为了避免混淆:

    这样做的目的是禁止卷积码,如:

    >>> d = {'a': 4}
    >>> f'{d[\'a\']}'
    '4'
    

    此外,我不允许将转义用于括号,如:

    >>> f'\x7bd["a"]}'
    '4'
    

    (其中chr(0x7b)=“{”)。