给出如下的简单代码:
def func(flag):
if flag:
seq = range(3)
return seq[1]
pep8和flake8都认为这段代码很好。为什么会这样? seq
仅在if
子句下定义。
答案 0 :(得分:1)
我对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
,否则您将无法获得测试的完整代码覆盖率{1}})smallest_prime_factor = 1
的内容进行初始化(这会误导代码的读者意味着有一种情况可以处理结果未在循环中初始化的位置)。在我看来,好像pep8
已经选择了简单而保守的选项:它不会诊断出可能不正确的内容。该修复不仅仅依赖于静态分析工具,当然不仅仅依赖于主要用于检测样式问题而非代码正确性的工具。使用完整的代码覆盖率编写测试 - 然后对于您的代码,flag
为false的测试将抛出,诊断您的错误。