为什么pep8 / flake8无法检测仅在branch中声明的未绑定局部变量

时间:2013-10-21 08:22:21

标签: python pep8 flake8

给出如下的简单代码:

def func(flag):
    if flag:
        seq = range(3)
    return seq[1]

pep8和flake8都认为这段代码很好。为什么会这样? seq仅在if子句下定义。

1 个答案:

答案 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的内容进行初始化(这会误导代码的读者意味着有一种情况可以处理结果未在循环中初始化的位置)。
  • 禁用此变量(https://github.com/cburroughs/pep8.py/issues/12
  • 的检查
  • 不诊断有条件的未定义变量(这意味着你会错过一些错误)。

在我看来,好像pep8已经选择了简单而保守的选项:它不会诊断出可能不正确的内容。该修复不仅仅依赖于静态分析工具,当然不仅仅依赖于主要用于检测样式问题而非代码正确性的工具。使用完整的代码覆盖率编写测试 - 然后对于您的代码,flag为false的测试将抛出,诊断您的错误。