我可以得到警告总是在 Python 中评估为真吗?

Can I get a warning always evaluates to true in Python?

我的代码中有这样一个错误:

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

我花了一些时间来调试它。如果我是正确的,第一个操作数的计算结果总是为真,这会导致 if 语句的主体始终执行。

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

有什么方法可以让我 Python 警告我这些情况,或者不警告我(因为它被解释或什么的)?

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

if list_empty or x in my_list:

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

if number1 or number2 in my_list:

A(醒来 :))人立即看到错误(因为名称相似,并且通常识别数字而不是条件,对于带有 if name1 or name2 in my_list: 的字符串也是如此),但这需要静态分析器肯定知道类型。

甚至在那些 "trivial" 的情况下,谁知道程序员是否不想测试 number1 是否为零或 name1 是否为空以进行下一个测试?

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

对于字符串和 integer/float 文字,这个构造可能是一个错误,所以我用正则表达式写了一个糟糕的静态分析器。便宜,如果它大喊大叫,你很可能线路有问题(这里的独立示例会自我分析):

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: