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

考虑这个代码片段:

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)时使用。

我的search尝试也未能给我一个更深的解释。 我明白一个序列的长度属性可能会被懒惰地评估,并且__len__可以被编程以产生副作用,但单独是否有问题足以让Pylint称这种使用不正确。 因此,在我简单地configuration我的项目忽略规则之前,我想知道我是否在我的推理中丢失了一些东西。

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

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

使用len(SEQUENCE)没有什么问题 – 尽pipe效率可能不高(见chepner的评论 )。 无论如何,Pylint检查代码是否符合PEP 8风格指南

对于序列(string,列表,元组),使用空序列为假的事实。

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

作为一个临时的Python程序员,在语言之间徘徊,我认为len(SEQUENCE)结构更具可读性和显式性(“显式更好然后隐式”)。 但是,使用布尔上下文中空序列为False的事实被认为是“Pythonic”。

请注意,在使用NumPy数组时,实际上需要使用len(seq)(而不是仅仅检查seq的bool值)。

 a = numpy.array(range(10)) if a: print "a is not empty" 

导致一个exception:ValueError:具有多个元素的数组的真值是不明确的。 使用a.any()或a.all()

因此,对于同时使用Python列表和NumPy数组的代码,C1801消息不太有用。