我正在尝试为一个国内项目编写PEP-8兼容的代码,我有一行f字符串,长度超过80个字符

-在self点附近的实线。Text是80字符标记。

我试图以最python的方式将它分成不同的行,但唯一的答案实际上是我的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

linter认为我不尊重E122从PEP-8,有办法得到字符串的权利和代码兼容?


我想是的

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

来自Python代码风格指南:

对长行进行包装的首选方法是使用Python的隐含 括号、括号和大括号内的行续。

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

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

Python字符串在没有逗号分隔时将自动连接,因此不需要显式调用join()。


正如@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

你可以使用三单引号或三双引号,但在字符串的开头放一个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”,因为您使用的是多行字符串。


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

foo = 'bar'
baz = 'bletch'
print(f'foo is {foo}!\n',
      'bar is bar!\n',
      f"baz is {baz}!\n",
      '''bletch
      is
      bletch!''')

打印这个(注意缩进):

foo is bar!
 bar is bar!
 baz is bletch!
 bletch
      is
      bletch!