【问题标题】:Multiline f-string in PythonPython中的多行f字符串
【发布时间】:2018-02-08 10:32:24
【问题描述】:

我正在尝试为一个国内项目编写符合 PEP-8 的代码,并且我有一行包含超过 80 个字符的 f 字符串

- 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

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

【问题讨论】:

  • 或者只是告诉你的 ide 增加行字符限制,或者一起忽略该规则
  • 我不觉得这是一个骗局。f 字符串不在那里讨论。
  • @JoshLee "E122 续行缺少缩进或突出的主" 也是为什么你关闭了这个问题?没有重复,它是关于多行 f 字符串的唯一一个
  • @Owlzy 答案不完全相同:使用括号,而不是行继续标记?
  • 这个问题不应该作为一个骗子被关闭,因为链接的“骗子”不是这个问题的骗子。 Stackoverflow 高级用户,你知道我们有一个问题,就是像这样过于激进,重新打开它。尽快重新投票。

标签: python string python-3.6 f-string


【解决方案1】:

我认为是

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

【讨论】:

  • 现在它已关闭,如果人们认为我应该删除这个答案,我可以删除它......但它没有包含在欺骗答案中:/\
  • 但是这种多行违背了 f 字符串和缩进的目的我也不觉得这是三引号字符串的正确使用,感觉就像一个 hack
  • 虽然这个答案确实复制了 OP 的意图,但我觉得@noddy 的答案更好。这个答案 恰好 是正确的,因为 OP 还希望在输出中使用多行。如果您希望输出具有与源代码不同的布局,则不适合使用三引号。
  • 看起来不错,但在缩进和代码布局方面存在问题。
  • 将其与内置的inspect.cleandoc 函数混合使用,您将度过美好的一天:)
【解决方案2】:

来自Style Guide for Python Code

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

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

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

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

【讨论】:

  • \n 不会导致 Windows 出现问题吗?有没有办法在没有 Unix 特定的\n 的情况下做到这一点?
  • 在 Windows 上没有问题。 \n 与平台无关,因为 Python 自 3.0 以来默认启用了 universal newlines
  • 哦,是的,我试过了,它奏效了。这里忘记更新了。好旧的 Python :')。
  • 请记住,由于额外的中间(取消)分配和复制,这可能比做一个大的 f 字符串效率低。但这是为了获得更易读的代码而做出的一个很好的权衡!
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 关于“\n”的好点 - 这里是another reference,它也解释了多行字符串不是必需的(在“带三引号的多行字符串”部分)。
    【解决方案5】:

    您可以混合使用多行引用样式和常规字符串和 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!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-15
      • 2021-12-05
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      相关资源
      最近更新 更多