我可以在Python中获得始终为true的警告吗?

时间:2018-10-10 08:24:41

标签: python python-2.7 if-statement warnings

我的代码中存在如下错误:

if 'char' or 'CHAR' in dt:
    foo = 'ch'

,我花了一些时间对其进行调试。如果我是对的,则第一个操作数的值始终为true,这将导致if语句的主体始终执行。

在C ++中,在某些情况下,我会得到警告,这使得消除此类错误变得容易。

我有什么办法让Python警告我这些情况吗?(因为它被解释了)?

1 个答案:

答案 0 :(得分:2)

在一般情况下,很难不发出误报。想象一下这段代码:

if list_empty or x in my_list:

这对任何人都完全有效,因为list_empty可能是布尔值。现在使用:

if number1 or number2 in my_list:

(醒来的:))人员会立即看到错误(因为名称相似,并且通常标识数字而不是条件,对于带有if name1 or name2 in my_list:的字符串来说是相同的),但是这将需要静态分析器执行确定确定类型。

即使在那些“琐碎”的情况下,谁知道程序员是否不想测试number1是否为零或name1为空以进行下一个测试?

类型注释可能会有所帮助,我并没有测试所有工具来给您一个肯定的答案,但是python的动态特性使得很难确定程序员的意图,以及分析器程序的价值发出大量误报?

对于字符串和整数/浮点文字,此构造可能是一个错误,因此我用正则表达式编写了一个糟糕的静态分析器。便宜,如果大喊大叫,您很可能会遇到一条错误的线路(此处是一个自我分析的独立示例):

dt=[]
if 'char' or 'CHAR' in dt:
    foo = 'ch'
if 12.0 and 45 in dt:
    foo = 'ch'

import re
infamous_bug = re.compile("if\s+(['\"].*?['\"]|[\d\.]+)\s+(or|and)")
with open(__file__) as f:
    for line in f:
        if infamous_bug.search(line):
            print("GOTCHA {}".format(line.rstrip()))

输出:

GOTCHA if 'char' or 'CHAR' in dt:
GOTCHA if 12.0 and 45 in dt: