为什么在由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消息不太有用。