当前位置: 首页 > 知识库问答 >
问题:

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

梁鸣
2023-03-14

考虑此代码段:

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):当Pylint检测到len(SEQUENCE)在条件内使用不正确时,不要使用len(SEQUENCE)作为条件值。

我的搜索尝试也未能为我提供更深入的解释。我确实理解序列的长度属性可能会被延迟评估,并且\uuu len\uuuu可以被编程为具有副作用,但仅此一点就足以让Pylint认为这样的使用是不正确的,这是值得怀疑的。因此,在我将我的项目配置为忽略规则之前,我想知道我的推理是否遗漏了一些东西。

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

共有3个答案

邴俊达
2023-03-14

这是Pylint中的一个问题,它不再认为len(x)==0不正确。

您不应该使用裸len(x)作为条件。比较len(x)与显式值,如if len(x)==0ofif len(x)

政治公众人物8:

# Correct:
if not seq:
if seq:

# Wrong:
if len(seq):
if not len(seq):

请注意,不禁止明确测试长度。蟒蛇的禅宗说:

显性比隐性好。

if not seqif not len(seq)之间的选择中,两者都是隐式的,但行为不同。但是如果len(seq)==0或如果len(seq)

在Pylint中,PR 2815修复了这个bug,最初报告为问题2684。它将继续抱怨if len(seq),但不再抱怨if len(seq)

李招
2023-03-14

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

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

导致异常:ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

因此,对于同时使用Python列表和NumPy数组的代码来说,C1801消息没有什么帮助。

令狐昌胤
2023-03-14

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

使用len(SEQUENCE)并没有什么问题,尽管它可能没有那么有效(参见切普纳的评论)。不管怎样,Pylint检查代码是否符合PEP 8样式指南,该指南规定

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

Yes: if not seq:
     if seq:

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

作为一个偶尔在语言之间飞过的Python程序员,我会认为 LeN(序列) 构造更可读和显式(“显式好于隐式”)。然而,在布尔上下文中使用空序列的计算结果为False这一事实被认为更“Pythonic”。

 类似资料:
  • 问题内容: 尝试编译时出现“不是语句”的编译错误,代码为: 当这些功能是: 有任何想法吗? 问题答案: 是的,您不能像这样使用条件运算符。其目的是计算一个或另一个 表达式 。它并不是要选择一个要执行的 语句 或另一条 语句 的方法。 只需使用:

  • 我看过一些代码,其中人们使用了带有两个“!”的条件子句s 这是我能找到的一些例子。 使用有什么好处超过?

  • 在我的代码中,我有以下行: 在野外,它生活在一个枚举中: 我从sonarqube那里得到以下提及: 使“形状”暂时或可序列化。可序列化类中的字段本身必须是可序列化的或瞬态的,即使该类从未显式序列化或反序列化。这是因为在负载下,大多数J2EE应用程序框架都会将对象刷新到磁盘,而一个据称具有非瞬态、非序列化数据成员的可序列化对象可能会导致程序崩溃,并为攻击者打开大门。 据我所知,int[](和int[

  • 为什么这个字符串是数字的?那些字符代表什么?

  • 我听到一些人说,即使在使用获得种子之后,使用也是很糟糕的。为什么会这样?我想知道事情是怎么发生的...抱歉,我又问了一个问题..但是,有什么办法可以替代这一点呢?

  • 我试图使用Jackson的XMLMapper将对象序列化为XML。我希望它在适当的区域有名称空间。然而,当我序列化对象时,每个属性都有一个名称空间--直接属于我试图序列化的类的属性将有一个xmlns=“”,被引用类上的每个属性都包含它们自己的名称空间前缀(而不是整个被引用类的单个前缀)。 我用的是杰克逊2.9.8 我要序列化的主类: 一种特殊类型: XmlMapper配置和测试: 实际的XML输出