【问题标题】:Why do not f-strings work in comprehensions inside other f-strings?为什么 f-strings 在其他 f-strings 内的理解中不起作用?
【发布时间】:2021-12-16 23:17:42
【问题描述】:

我想在一个生成器中使用一个 f-string,我把它放在另一个 f-string 中,比如这里:

MORSE_CODE = {'123' : '456', '789' : 'qwe'}
print(f'{(f'{key}, {value}' for key, value in MORSE_CODE.items())}')

运行时出现下一个错误:

  File "<ipython-input-10-05579b450d5e>", line 2
    print(f'{(f'{key}, {value}' for key, value in MORSE_CODE.items())}')
                ^
SyntaxError: invalid syntax

起初我认为在生成器中使用 f 字符串是不可能的,但是当我将它 (f'{key}, {value}' for key, value in MORSE_CODE.items()) 放入变量时,它起作用了:

a = (f'{key}, {value}' for key, value in MORSE_CODE.items())
print(f'{{{a}}}')

{<generator object <genexpr> at 0x0000025EE94EF200>}

这在 Python 中是如何工作的?我无法在谷歌上搜索有关将 f 字符串工作到另一个 f 字符串中的生成器的信息。这几段代码有什么区别?

【问题讨论】:

  • 这与生成器无关,与它们无关。这只是关于嵌套 f 字符串。你的最后一个 sn-p 没有嵌套,你的第一个 sn-p 有。
  • 您想要实现的具体目标是什么?我没有看到 f-string 中带有另一个 f-string 的生成器表达式的意义(不管它是否可能)。
  • 更改其中一个以使用双引号。

标签: python f-string


【解决方案1】:

不确定预期的输出是什么,但是当使用不同的字符串引号 "' 时,解析器可以区分内部 f 字符串的开头和外部 f 字符串的结尾。

MORSE_CODE = {'123' : '456', '789' : 'qwe'}
print(f'{(f"{key}, {value}" for key, value in MORSE_CODE.items())}')

【讨论】:

  • 感谢您的回答!我自己刚刚发现了这个,并且在你回答的那一刻正在输入这个。之前我认为大括号内的表达式独立于外部字符串。
【解决方案2】:

我刚刚意外地发现,如果您使用不同的引号,这将非常有效。我没想到会这样,因为我认为大括号内的表达式与字符串无关,所以我可以使用任何引号,但它们的更改解决了问题。

MORSE_CODE = {'123' : '456', '789' : 'qwe'}
print(f'{{{(f"{key}, {value}, " for key, value in MORSE_CODE.items())}}}')

{<generator object <genexpr> at 0x0000025EE95BEA50>}

但是,我现在很好奇为什么这些引用是依赖的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 2019-10-28
    • 1970-01-01
    • 2017-08-24
    • 2023-02-10
    • 2020-02-24
    • 1970-01-01
    相关资源
    最近更新 更多