如何最好地使用 f 字符串处理 pylint 长线检查?

Posted

技术标签:

【中文标题】如何最好地使用 f 字符串处理 pylint 长线检查?【英文标题】:How do I best handle pylint long-line checks with f-strings? 【发布时间】:2021-09-24 23:05:47 【问题描述】:

让我以我喜欢pylint f-strings的事实作为开头。不幸的是,公司政策规定了最大行长,使用长 f 字符串不符合该政策。例如:

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 字符串的主要好处,即数据与周围文本内联的能力,所以我不必去寻找它。

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

有没有办法做一个 single f-string 但以阻止pylint 抱怨长度的方式分解?我正在考虑类似以下(神话)的方法,它执行 C 在自动连接字符串文字中所做的事情:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我认为这可能不适用于 f-strings,但它确实有效。它优化混合的字符串常量和计算值,就像我把整个东西放在一行一样。 它给出以下警告信息:‘\’: E502 the backslash is redundant between brackets @alper 示例中没有括号。 what 也给出了警告?这些是 pylint 警告,与 CPython 无关。 我让他们在pylint。啊,如果我在 print() 中创建它们,print 的括号将导致警告消息【参考方案2】:

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

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'
)

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

【讨论】:

【参考方案3】:

你可以用括号将字符串括起来,并使用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")。

【讨论】:

【参考方案4】:

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

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'))

【讨论】:

以上是关于如何最好地使用 f 字符串处理 pylint 长线检查?的主要内容,如果未能解决你的问题,请参考以下文章

如何在windows下为pylint指定配置文件?

如何最好地将字符串表示形式转换为 DbType?

耳机延长线会影响音质吗?

耳机线和耳机延长线如果连接?

Python代码规范:代码规范整改和编码技巧-pylint扫描问题整改

如何使用 Pylint 来规范 Python 代码风格