使用变量构造长的Python字符串

时间:2018-12-18 06:08:52

标签: python python-3.x string string-formatting f-string

我有一个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开始抱怨,所以我尝试使用多行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保持静音?

2 个答案:

答案 0 :(得分:7)

这是一条很长的线,因此,我将其分解并应用"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的以下几点智慧很适合我们的问题:

  

稀疏比稠密好。

     

可读性计数。

答案 1 :(得分: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