考虑到这个代码片段:
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)用作条件值
len(SEQUENCE)
乍一看,规则 C1801 对我来说听起来不是很合理,参考指南上的定义也没有解释为什么这是一个问题。事实上,它彻头彻尾地称之为 不正确的使用 。
len-as-condition (C1801) : 不用len(SEQUENCE)作条件值 当 Pylint 检测到条件内不正确使用 len(sequence) 时使用。
我的搜索尝试也未能为我提供更深入的解释。我确实理解序列的长度属性可能会被延迟评估,并且__len__可以对其进行编程以产生副作用,但值得怀疑的是,仅此一项是否足以让 Pylint 称这种用法不正确。因此,在我简单地配置我的项目以忽略该规则之前,我想知道我是否在推理中遗漏了一些东西。
__len__
什么时候使用len(SEQ)作为条件值有问题?Pylint 试图通过 C1801 避免哪些主要情况?
len(SEQ)
使用起来并没有 真正 的问题——len(SEQUENCE)尽管它可能效率不高。无论如何,Pylint 检查代码是否符合PEP 8风格指南,该指南指出
对于序列(字符串、列表、元组),使用空序列为假的事实。 **Yes:** if not seq: if seq: **No:** if len(seq): if not len(seq):
对于序列(字符串、列表、元组),使用空序列为假的事实。
**Yes:** if not seq: if seq: **No:** if len(seq): if not len(seq):
作为一个偶尔在语言之间来回穿梭的 Python 程序员,我认为该len(SEQUENCE)结构更具可读性和显式(“显式优于隐式”)。然而,在布尔上下文中使用空序列求值的事实False被认为更“ythonic”。
False