使用变量构造一个长 Python 字符串

Constructing a long Python string using variables

我有一个 python 字符串,它基本上是 3 variables.I 的串联,我正在使用 f-strings 使其成为一个字符串。现在看起来像这样:

my_string = f'{getattr(RequestMethodVerbMapping, self.request_method).value} {self.serializer.Meta.model.__name__} {self.request_data['name']}'

这给了我输出:

Create IPGroup test-create-demo-098

正是我想要的输出。然而,很明显这条线太长了,现在 Pylint 开始抱怨所以我尝试使用多行 f-strings 来打破这条线,如下所示:

my_string = f'''{getattr(RequestMethodVerbMapping, self.request_method).value} 
                {self.serializer.Meta.model.__name__} {self.request_data['name']}'''

Pylint 现在很开心,但我的字符串如下所示:

Create 
                  IPGroup test-create-demo-098

执行此操作的最佳方法是什么,这样我就可以在一行中获取我的字符串,并且对于超过 120 个字符的行也可以使 Pylint 静音?

这本身就是一长行,我不会尝试将很多内容放入一行,而是将其分解并应用 "Extract Variable" 重构方法以提高可读性:

request_method_name = getattr(RequestMethodVerbMapping, self.request_method).value
model_name = self.serializer.Meta.model.__name__
name = self.request_data['name']

my_string = f'{request_method_name} {model_name} {name}'

我认为 Zen of Python 的以下智慧很适合我们这里的问题:

Sparse is better than dense.

Readability counts.

可以像普通字符串一样,在中间仅使用空格来连接 f 字符串。把整个事情都用括号括起来。

my_string = (f'{getattr(RequestMethodVerbMapping, self.request_method).value}' 
             f' {self.serializer.Meta.model.__name__}
             f' {self.request_data["name"]}')

它将编译为与您的单行字符串完全相同的代码。

甚至可以交错 f 弦和非 f 弦:

>>> print(f"'foo'" '"{bar}"' f'{1 + 42}')
'foo'"{bar}"43