Python中的多行f-string

275

我正在尝试编写符合PEP-8标准的国内项目代码,但是我有一行包含f-string的代码超过了80个字符

self.text附近的实线是80个字符标记。

我正在尝试以最Pythonic的方式将其拆分为不同的行,但唯一有效的答案是我的linter错误。

有效代码:

def __str__(self):
    return f'{self.date} - {self.time},\nTags:' + \
    f' {self.tags},\nText: {self.text}'

输出:

2017-08-30 - 17:58:08.307055,
Tags: test tag,
Text: test text

代码检查器认为我没有遵守E122PEP-8的规范,有没有什么方法可以让字符串正确且代码符合规范?


2
或者只需告诉您的IDE增加行字符限制,或完全忽略该规则。 - Joran Beasley
29
我不觉得这是重复的。那里没有讨论 f 字符串。 - Ma0
4
@JoshLee "E122 continuation line missing indentation or outdented main"的意思是“E122:续行缺少缩进或主要部分没有进行缩进”。此外,你为什么关闭了这个问题?这里没有重复的内容,它是唯一一个关于多行f-strings的问题。 - Owlzy
2
@Owlzy 难道答案不是一样的吗:使用括号而不是行连续标记? - Nick T
10
这个问题不应该被关闭为重复,因为链接的“重复”与此问题不同。你们 Stackoverflow 的超级用户应该知道我们存在过于过激的问题处理方式的问题,希望能够重新开放此问题。请尽快投票以重新开放此问题。 - Urda
显示剩余7条评论
5个回答

355

根据 Python 代码风格指南

首选的换行方式是在括号、方括号和花括号内使用Python的隐含行连接。

有了这个,以下内容可以以符合PEP-8的方式解决您的问题。

return (
    f'{self.date} - {self.time}\n'
    f'Tags: {self.tags}\n'
    f'Text: {self.text}'
)

Python字符串在未被逗号分隔时会自动连接,因此您无需显式调用join()


5
在Windows上没有问题。\n 是跨平台的,因为自Python 3.0版本起,默认启用了通用换行符 - noddy
2
哦,是的,我尝试过这个,它有效。忘记在这里更新了。好老的 Python :')。 - shinvu
2
请记住,这种方法可能不如使用一个大的f-string高效,因为会有额外的中间(de-)分配和复制。但对于更易读的代码来说,这是一个很好的折衷方案! - Mattias Wallin
4
@MattiasWallin 这将生成与一个大的f-string完全相同的字节码。 - Mateen Ulhaq
4
@MateenUlhaq 正确!在编译器浏览器中测试过。这个答案表明它是在解析期间进行连接的。参考手册称其等同于连接版本。 - Mattias Wallin
显示剩余6条评论

87
我认为这将是。
return f'''{self.date} - {self.time},
Tags: {self.tags},
Text: {self.text}'''

1
既然问题已经解决,如果大家认为有必要的话,我可以删除这个回答……但是这个问题并没有在重复的答案中得到解决 :/\ - Joran Beasley
11
但是这种多行文本的写法违背了 f-string 和缩进的初衷。而且我觉得这并不是三引号字符串的正确使用方式,感觉有点像 hack。 - Owlzy
5
虽然这个答案实现了OP的意图,但我觉得@noddy的答案更好。这个答案之所以正确,只是因为OP也想要输出多行。如果你想让输出的布局与源代码不同,三引号并不是最好的选择。 - Mike Williamson
1
看起来不错,但会导致缩进和代码布局的问题。 - DZet
2
将此与内置的 inspect.cleandoc 函数混合使用,您将拥有愉快的一天 :) - Zack Plauché
显示剩余5条评论

79

您可以使用三个单引号或三个双引号,但在字符串开头加上 f:

三个单引号

return f'''{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}'''

三重双引号

return f"""{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}"""

请注意,由于您正在使用多行字符串,因此无需使用 "\n"。


5
关于"\n"的好处很不错 - 这里还有另一个参考链接,它也解释了在多行字符串中不需要使用它(在“三引号的多行字符串”一节中)。 - cellepo
为了避免断句,花括号 {} 可以通过使用 {{}} 进行转义。 - undefined

30

如@noddy所提到的,这种方法也适用于变量赋值表达式:

var1 = "foo"
var2 = "bar"
concat_var = (f"First var is: {var1}"
              f" and in same line Second var is: {var2}")
print(concat_var)

应该给你:

First var is: foo and in same line Second var is: bar

10
你可以混合使用多行引用样式、常规字符串和f-strings:
foo = 'bar'
baz = 'bletch'
print(f'foo is {foo}!\n',
      'bar is bar!\n',
      f"baz is {baz}!\n",
      "not f-string version: baz is {baz}!\n",
      '''bletch
      is
      bletch!''')

打印这个(请注意缩进):
foo is bar!
 bar is bar!
 baz is bletch!
 not f-string version: baz is {baz}!
 bletch
      is
      bletch!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接