小编典典

为什么在 Pylint 认为不正确的条件值中使用 len(SEQUENCE)?

all

考虑到这个代码片段:

from os import walk

files = []
for (dirpath, _, filenames) in walk(mydir):
    # More code that modifies files
if len(files) == 0: # <-- C1801
    return None

Pylint 对这条关于 if 语句行的消息感到震惊:

[pylint] C1801:不要len(SEQUENCE)用作条件值

乍一看,规则 C1801
对我来说听起来不是很合理,参考指南上的定义也没有解释为什么这是一个问题。事实上,它彻头彻尾地称之为
不正确的使用

len-as-condition (C1801)不用len(SEQUENCE)作条件值 当 Pylint 检测到条件内不正确使用
len(sequence) 时使用。

我的搜索尝试也未能为我提供更深入的解释。我确实理解序列的长度属性可能会被延迟评估,并且__len__可以对其进行编程以产生副作用,但值得怀疑的是,仅此一项是否足以让
Pylint 称这种用法不正确。因此,在我简单地配置我的项目以忽略该规则之前,我想知道我是否在推理中遗漏了一些东西。

什么时候使用len(SEQ)作为条件值有问题?Pylint 试图通过 C1801 避免哪些主要情况?


阅读 72

收藏
2022-06-02

共1个答案

小编典典

什么时候使用len(SEQ)作为条件值有问题?Pylint 试图通过 C1801 避免哪些主要情况?

使用起来并没有 真正 的问题——len(SEQUENCE)尽管它可能效率不高。无论如何,Pylint 检查代码是否符合PEP 8风格指南,该指南指出

对于序列(字符串、列表、元组),使用空序列为假的事实。

**Yes:** if not seq:
     if seq:

**No:**  if len(seq):
     if not len(seq):

作为一个偶尔在语言之间来回穿梭的 Python
程序员,我认为该len(SEQUENCE)结构更具可读性和显式(“显式优于隐式”)。然而,在布尔上下文中使用空序列求值的事实False被认为更“ythonic”。

2022-06-02