1

我有一个 python 字符串,它基本上是 3 个变量的串联。我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 开始抱怨,所以我尝试使用 multiline 分解这条线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

这样做的最佳方法是什么,以便我将字符串放在一行中,并让 Pylint 静音,因为该行超过 120 个字符?

4

2 回答 2

7

这本身就是一条长线,我不会尝试将很多内容放入一行中,而是将其分解并应用“提取变量”重构方法以提高可读性:

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

我认为Python 之禅的以下智慧非常适合我们的问题:

稀疏比密集好。

可读性很重要。

于 2018-12-18T06:27:48.590 回答
4

可以连接 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
于 2018-12-18T07:17:31.530 回答