考虑以下代码片段:
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)时使用。
我的搜索尝试也未能为我提供更深入的解释。我确实知道,序列的length属性可能会被延迟评估,并且__len__
可以编程为具有副作用,但是令人怀疑的是,仅此一个问题是否足以使Pylint认为这种用法不正确。因此,在我简单地将项目配置为忽略规则之前,我想知道我的推理中是否缺少某些内容。
什么时候将len(SEQ)
用作条件值有问题?Pylint尝试使用C1801避免哪些主要情况?
len
不知道调用它的上下文,因此如果计算长度意味着遍历整个序列,则必须;它不知道将结果与0进行比较。计算布尔值可以在看到第一个元素后停止,而不管该序列实际有多长时间。不过,我认为pylint在这方面有点自以为是;我无法想到使用错误的任何情况len
,只是这是比其他选择更糟糕的选择。
if files:
或if not files: