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

问题描述 投票:0回答:2

我已经升级到 pylint 2.15.2,每当我运行 pylint 时突然收到很多

consider-using-f-string
警告,其中我对字符串使用了 % 格式。我理解为什么 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.format(),因为您可以很好地将格式说明符

{}
从函数中分离出来,通过将它们放在单独的行中来生成我想要的字符串。使用 f-strings,我的行可能会变得太长,我不得不求助于使用行连续字符,这再次损害了 IMO 的可读性。

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

我的问题:

有没有办法配置 Pylint,这样当我运行它时,它不会在我使用 string.format() 时发出

consider-using-f-string
警告(仅当我使用 % strings 时)?我查看了 rc 文件,但看不到任何明显的设置。

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

python pylint f-string string.format
2个回答
1
投票

我同意你的看法。我不认为 f-strings 是个好主意。我不喜欢将表达式隐藏在文字字符串中,这可能会导致一些检查失败,而且我不相信这不是安全问题。它似乎也不是 Pythonic,因为使用格式字符串会强制以清晰的顺序正确评估表达式,而不是将代码压缩到字符串文字中。

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

也许我们应该将整个 Python 模块写在一个大字符串文字中?有人回到 PHP 吗?

甚至 Real Python 似乎认为 Python

format
的唯一缺点是可读性,但随后继续提供 人为的示例,并掩盖了在
dict
中向模板提供变量的简洁、优雅的解决方案,好像这不是设计
format
的全部意义!

但是我不确定您所说的“不标记”和“放弃”有什么区别,因为您要么想要这些警告。

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

所以要关闭

pylint
convention通知
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 弦会贬值并最终被删除 ;-)


0
投票

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

f_string = (f"The result of {a} + {b} is "
            f"{some_long_complicated_function(a, b)}")
© www.soinside.com 2019 - 2024. All rights reserved.