gpt4 book ai didi

python - 为什么 pep8/flake8 无法检测仅在 if 分支中声明的未绑定(bind)局部变量

转载 作者:行者123 更新时间:2023-11-28 17:45:09 24 4
gpt4 key购买 nike

给定如下简单的代码:

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

pep8和flake8都觉得这段代码不错。为什么会这样? seq 仅在 if 子句下定义。

最佳答案

我对 pep8 的设计和实现没有任何具体的了解,但是检测条件 undefined variable 一般是一件棘手的事情。例如,考虑以下代码:

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 子句(在这种情况下,除非您注入(inject)一个模拟版本的 generate_primes,否则您将无法获得测试的完整代码覆盖率t满足generate_primes)
  • 的契约
  • 要求在循环之前用 smallest_prime_factor = 1 之类的东西进行初始化(这误导性地向代码读者暗示有一种情况需要处理结果不是 在循环中初始化)。
  • 仅针对此变量禁用检查 (https://github.com/cburroughs/pep8.py/issues/12)
  • 不要诊断条件 undefined variable (这意味着您会遗漏一些错误)。

在我看来,pep8 似乎选择了简单而保守的选项:它不诊断可能不正确的内容。解决方法不是仅仅依赖于静态分析工具,当然也不是仅仅依赖于主要设计用于检测样式问题而非代码正确性问题的工具。编写具有完整代码覆盖率的测试——然后对于您的代码,flag 为 false 的测试将抛出,诊断您的错误。

关于python - 为什么 pep8/flake8 无法检测仅在 if 分支中声明的未绑定(bind)局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19489403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com