Pylint 不喜欢 string.format(),并希望我使用 f 字符串。这是可以修复的吗?



我已经升级到pylint 2.15.2,突然我得到很多consider-using-f-string警告每当我运行pylint,我已经使用%格式化字符串。我理解为什么Pylint不想使用旧的%格式化,但是当我尝试使用string.format()时,我也得到了这个错误。以下面的代码为例:

"""Example module"""
def some_long_complicated_function(a, b):
"""Do something"""
return a + b
def main():
"""Main function"""
a = 2
b = 3
percent_string = "The result of %s + %s is %s" % (
a, b, some_long_complicated_function(a, b)
)
format_string = "The result of {} + {} is {}".format(
a, b, some_long_complicated_function(a, b)
)
f_string = f"The result of {a} + {b} is {some_long_complicated_function(a, b)}"
print(percent_string)
print(format_string)
print(f_string)
if __name__ == "__main__":
main()

当我在这段代码上运行pylint时,我得到以下输出:

************* Module pyexample
./pyexample.py:11:21: C0209: Formatting a regular string which could be a f-string (consider-using-f-string)
./pyexample.py:15:20: C0209: Formatting a regular string which could be a f-string (consider-using-f-string)
------------------------------------------------------------------
Your code has been rated at 8.46/10 (previous run: 6.15/10, +2.31)
在这样的情况下,我不希望使用f-string,因为我认为它实际上会妨碍-而不是帮助-可读性,特别是在这样的情况下,我可能会在字符串中内联编写长函数调用。在这些地方,我宁愿使用string.format(),因为您可以很好地将格式说明符{}从函数中分离出来,通过将它们放在单独的行中来生成我想要的字符串。使用f字符串,我的行可能会太长,我不得不求助于使用行延续字符,这再次损害可读性。

问题是,Pylint不喜欢string.format()——它只希望我使用f-strings。我知道这是一个"约定"而不是"错误",但我的代码必须100%通过Pylint。我可以放弃此消息,但这不是一个好的做法,并且在我的代码中有一些地方我确实想要交换出%-string格式。

我的问题:

是否有一种方法来配置Pylint,以便当我运行它时,当我使用string.format()(仅当我使用% strings)时,它不会标记consider-using-f-string警告?我已经在rc文件中查看了一下,但是我没有看到任何像这样明显的设置。

或者解决这个问题的唯一方法是完全放弃警告?

我同意。我不认为f弦是个好主意。我不喜欢在文字字符串中隐藏表达式,这可能会破坏一些检查,我不相信这不是一个安全问题。这似乎也不符合python的风格,因为使用格式字符串会强制表达式以明确的顺序正确求值,而不是压缩字符串文字中的代码。

格式字符串也可以采用字典,然后非常可读地允许在模板内分发名称,所以我不确定f字符串是否真的更可读,因为我相信你也在争论。这个问题甚至有一个答案,它提出了一个解决方案,以提高包含太多代码的字符串的可读性!

也许我们应该把整个Python模块写在一个大字符串字面量里?回到PHP吧?

甚至真正的Python似乎认为Pythonformat的唯一缺点是可读性,但随后提供了一个做作的例子,并掩盖了在dict中向模板提供变量的简洁,优雅的解决方案,好像这不是设计format的全部意义!

但是我不确定你所说的"不标志"是什么意思。和"放弃",因为你要么想要这些警告,要么不想要。

https://pylint.readthedocs.io/en/latest/user_guide/messages/convention/consider-using-f-string.html

所以只要关闭pylint约定注意consider-using-f-string/C0209,只需将该代码添加到.pylintrc的禁用列表:

[MESSAGES CONTROL]
disable = C0209

或者如果您更喜欢有意义的名称:

[MESSAGES CONTROL]
disable = consider-using-f-string

如果您已经禁用了一些消息,那么只需将其添加到列表中:

[MESSAGES CONTROL]
disable = E0602, E1101, C0103, C0209, C3001

再也不用担心了。

可能有一天f字符串会贬值并最终被删除;-)

如果你只是想避免长行或行连续字符,我通常选择使用括号:

f_string = (f"The result of {a} + {b} is "
f"{some_long_complicated_function(a, b)}")

最新更新