2

pylint 让我以我喜欢 f 弦和f 弦的事实作为开头。不幸的是,公司政策规定了最大行长,使用长 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-strings 的主要好处,即数据与周围文本内联的能力,所以我不必去寻找它。

可以做两个单独的 f 字符串并将它们与 连接+,但这似乎有点浪费。

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

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

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

4

4 回答 4

2

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

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
于 2021-07-16T05:51:10.843 回答
1

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

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 字符串,请参阅第二个选项。更多想法可以在类似问题中找到。

于 2021-07-16T06:02:25.367 回答
1

您可以用括号括住字符串并使用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'
)

黑色可​​以半自动地做到这一点,您只需'f'在第 87 个字符后添加一个字符串并应用自动格式化(或"f"在您第一次应用它之后)。

于 2021-07-16T19:53:15.163 回答
0

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

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'))
于 2021-07-16T05:57:21.033 回答