我可以得到警告总是在 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:
我的代码中有这样一个错误:
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: