我如何最好地处理 f-strings 的 pylint 长线检查?

How do I best handle pylint long-line checks with f-strings?

让我先说明一下我喜欢 pylint f 弦的事实。不幸的是,公司政策规定了最大行长度,使用长的 f-strings 不符合该政策。例如:

xyzzy = f'Let us pretend this line (from {first_name} {last_name}) is too long')

我知道,使用 str.format(),有一个相当简单的方法:

xyzzy = 'Let us pretend this line (from {} {}) is too long'.format(
    first_name, last_name)

但是,我真的不想放弃 f-strings 的主要好处,即让数据与周围文本内联的能力,所以我不必去寻找它。

可以做两个单独的f-string并用+连接它们,但这似乎有点浪费。

有没有办法做一个 f 弦但以停止 pylint 抱怨长度的方式分解?我正在考虑类似于以下(神话般的)方法的方法,它在自动神奇地连接字符串文字时执行 C 的操作:

xyzzy = f'Let us pretend this line (from {first_name} '
        f'{last_name}) is too long')

请注意,这与第一行末尾带有 +结构 差别不大,但我怀疑后者是两个不同的操作字节码。

我想在你的情况下,最好使用使用反斜杠的常规行继续方法 \:

xyzzy = f'Let us pretend this line (from {first_name} ' \
        f'{last_name}) is too long')

请注意,它生成与单行相同的字节码:

>>> def foo():
...   return "long line"
... 
>>> def bar():
...   return "long " \
...   "line"
... 
>>> dis.dis(foo)
  2           0 LOAD_CONST               1 ('long line')
              2 RETURN_VALUE
>>> dis.dis(bar)
  2           0 LOAD_CONST               1 ('long line')
              2 RETURN_VALUE

也就是说,CPython 编译器在简单优化方面非常聪明:

>>> def foobar():
...   return "long " + "line"
... 
>>> dis.dis(foobar)
  2           0 LOAD_CONST               1 ('long line')
              2 RETURN_VALUE

最好的方法是用反斜杠连接 (\):

xyzzy = f'Let us pretend this line (from {first_name} ' \
    f'{last_name}) is too long')

或者使用不推荐的方式:)

xyzzy = ''.join((f'Let us pretend this line (from {first_name} ', 
    f'{last_name}) is too long'))

我找到了以下三种方法来解决这个问题:

first_name = 'John'
last_name = 'Doe'

foo = f'Let us pretend this line (from {first_name} ' \
    f'{last_name}) is too long ' \
    f'Let us pretend this line (from {first_name} ' \
    f'{last_name}) is too long'

bar = f"""Let us pretend this line (from {first_name}
{last_name}) is too long
Let us pretend this line (from {first_name}
{last_name}) is too long""".replace('\n', ' ')

xyz = (
    f'Let us pretend this line (from {first_name} '
    f'{last_name}) is too long '
    f'Let us pretend this line (from {first_name} '
    f'{last_name}) is too long'
)

我个人认为最后一个变体看起来最干净,但如果您想使用 单个 f-string,请参阅第二个选项。更多想法可以在 similar question.

找到

您可以用括号将字符串括起来,并使用 python 的隐式字符串连接:

xyzzy = (
    f'Let us pretend this line (from {first_name} '
    f'{last_name}) is too long).'
    ' This is a non f-string part of the string'
)

Black 可以半自动执行此操作,您只需在字符串中的第 87 个字符后添加一个 'f' 并应用自动格式化(或在您第一次应用后添加 "f") .