Python中的多行f字符串

Owl*_*lzy 43 python string python-3.6

我正在尝试为国内项目编写符合PEP-8的代码(我必须承认这些是我在python世界中的第一步)并且我有一个超过80个字符长的f字符串

- self.text上点附近的实线是80个字符.(抱歉没有预览的悲伤链接,但我必须有10+代表发布'em)

我试图把它分离成在最不一样的行Python的方式,但实际工作的唯一aswer是我棉短绒错误

工作守则:

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

输出:

2017-08-30 - 17:58:08.307055,
Tags: test tag,
Text: test text
Run Code Online (Sandbox Code Playgroud)

linter认为我不尊重PEP-8中的E122,有没有办法让字符串正确并符合代码?

nod*_*ddy 30

Python代码样式指南

包装长行的首选方法是在括号,方括号和花括号内使用Python的隐含行连续性。

鉴于此,以下将以符合PEP-8的方式解决您的问题。

return (
    f'{self.date} - {self.time}\n'
    f'Tags: {self.tags}\n'
    f'Text: {self.text}'
)
Run Code Online (Sandbox Code Playgroud)

当不使用逗号分隔时,Python字符串将自动连接,因此您无需显式调用join()

  • Windows 上没有问题。`\n` 与平台无关,因为 Python 自 3.0 起默认启用[通用换行符](https://docs.python.org/3/glossary.html#term-universal-newlines)。 (5认同)
  • @MattiasWallin 这会生成与一个大 f 字符串完全相同的字节码。 (5认同)
  • @MateenUlhaq 正确!在编译器资源管理器中测试。[这个答案](/sf/ask/2392217761/)表明它在解析过程中被连接。[参考手册](https://docs.python.org/3/reference/lexical_analysis.html#string-literal-concatenation)说它相当于串联版本。 (4认同)
  • 哦,是的,我尝试过这个并且有效。忘记更新这里了。好老Python:')。 (2认同)
  • 请记住,由于额外的中间(取消)分配和复制,这可能比执行一个大 f 字符串效率低。但这是获得更具可读性的代码的一个很好的权衡! (2认同)

lmi*_*asf 27

您可以使用三重单引号或三重双引号,但在字符串的开头放置一个 f:

三重单引号

return f'''{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}'''
Run Code Online (Sandbox Code Playgroud)

三重双引号

return f"""{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}"""
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要使用“\n”,因为您使用的是多行字符串。

  • 关于“\n”的好点 - 这里是[另一个参考](https://automatetheboringstuff.com/chapter6/),它也解释了多行字符串没有必要(在“带有三引号的多行字符串”部分)。 (5认同)

Jor*_*ley 22

我想是的

return f'''{self.date} - {self.time},
Tags: {self.tags},
Text: {self.text}'''
Run Code Online (Sandbox Code Playgroud)

  • 但这种多线打败了f字符串和缩进的目的另外我不觉得这是三重引号字符串的正确用法,感觉就像一个黑客 (8认同)
  • 虽然这个答案确实复制了OP的意图,但我觉得@noddy的答案更好。这个答案“恰好”是正确的,因为OP也希望输出中包含多行。如果您希望输出具有与源代码不同的布局,那么三引号不是正确的选择。 (2认同)
  • 将其与内置的“inspect.cleandoc”函数混合使用,您将会度过美好的一天:) (2认同)

cod*_*ior 16

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

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

应该给你:

First var is: foo and in same line Second var is: bar
Run Code Online (Sandbox Code Playgroud)


Tim*_*and 11

您可以混合多行引用样式以及常规字符串和 f 字符串:

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!''')
Run Code Online (Sandbox Code Playgroud)

打印此内容(注意缩进):

foo is bar!
 bar is bar!
 baz is bletch!
 not f-string version: baz is {baz}!
 bletch
      is
      bletch!
Run Code Online (Sandbox Code Playgroud)