代码之家  ›  专栏  ›  技术社区  ›  gsamaras a Data Head

在Python中,我能得到一个总是计算为true的警告吗?

  •  2
  • gsamaras a Data Head  · 技术社区  · 6 年前

    我的代码中有这样一个bug:

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

    我花了一段时间来调试。如果我是正确的,则第一个操作数的计算结果始终为true,这将导致If语句体始终执行。

    在C++中,我会在这些情况下得到警告,使这些bug的消灭变得容易。

    有没有什么方法可以让Python在这些情况下警告我(因为它会被解释或其他什么)?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jean-François Fabre    6 年前

    一般情况下很难不发出假阳性。想象一下这个代码:

    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 是否为空以继续进行下一个测试?

    字符串(&A);整型/浮点文本这个构造可能是个错误,所以我用regex编写了一个糟糕的静态分析器。便宜,如果它大叫,你很可能与一个错误的线路(这里是一个独立的例子,自我分析本身):

    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: