如何最好地使用 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 长线检查?的主要内容,如果未能解决你的问题,请参考以下文章