3

给定一个简单的代码,如下所示:

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

pep8 和 flake8 都认为这段代码不错。为什么会发生这种情况?seq仅在if条款下定义。

4

1 回答 1

2

我对 的设计和实现没有任何具体的知识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_primesgenerate_primes
  • 需要在循环之前使用类似的东西进行初始化smallest_prime_factor = 1(这误导性地暗示代码的读者有一种情况需要处理结果在循环中初始化的情况)。
  • 禁用仅对该变量的检查(https://github.com/cburroughs/pep8.py/issues/12
  • 不要诊断条件未定义的变量(这意味着您会错过一些错误)。

在我看来,它似乎pep8选择了简单而保守的选择:它不会诊断出可能不正确的东西。解决方法不是仅仅依靠静态分析工具,当然也不是仅仅依靠主要用于检测风格问题而不是代码正确性问题的工具。编写具有完整代码覆盖率的测试 - 然后对于您的代码,测试 where flagis false 将抛出,诊断您的错误。

于 2013-10-21T08:46:05.730 回答