给定一个简单的代码,如下所示:
def func(flag):
if flag:
seq = range(3)
return seq[1]
pep8 和 flake8 都认为这段代码不错。为什么会发生这种情况?seq
仅在if
条款下定义。
我对 的设计和实现没有任何具体的知识pep8
,但是检测条件未定义的变量通常是一件棘手的事情。例如,考虑以下代码:
def func(value):
if value < 2:
raise ValueError()
for p in generate_primes():
if value % p == 0:
smallest_prime_factor = p
break
do_something_with(smallest_prime_factor)
现在,程序员知道只要传入一个整数,其中一项测试就会通过。静态分析工具不知道这一点。那么你的工具要做什么呢?
else
模拟版本,否则您将无法获得测试的完整代码覆盖率)generate_primes
generate_primes
smallest_prime_factor = 1
(这误导性地暗示代码的读者有一种情况需要处理结果未在循环中初始化的情况)。在我看来,它似乎pep8
选择了简单而保守的选择:它不会诊断出可能不正确的东西。解决方法不是仅仅依靠静态分析工具,当然也不是仅仅依靠主要用于检测风格问题而不是代码正确性问题的工具。编写具有完整代码覆盖率的测试 - 然后对于您的代码,测试 where flag
is false 将抛出,诊断您的错误。