当代码审查工具声明不匹配的类型时该怎么办



我正在开发一个大型Python(后端(项目。我在一家进行广泛测试的公司工作,他们构建了前端和测试工具。在每次部署之前,所有工具(如linters(都会定期运行。

我已经把代码放了一段时间,现在它通过了很多测试。其中一些是即将弃用的功能或语法的弃用警告,他们注意到,从2020年1月1日起,他们开始将这些功能或语法归类为警告(后来会变成错误(,所以我知道他们会对工具本身进行动态更改。

我的问题是,过去传递的一堆代码不再传递了。错误总是一样的:如果我有一行看起来是这样的,我会得到一个错误,上面写着"错误:可能不会将运算符'-'与不兼容的类型一起使用;a和b的类型是numpy.array和NoneType":

x = a - b

这是通过以下修复方法使代码变得超级混乱来修复的:

x = a.astype(float) - b.astype(float)

更糟糕的是,在实际代码中有3个变量,所有变量都用一个"c"进行加法和减法运算,"c"是一个整数数组,与两个numpy数组一起使用。但代码来自:

x = a - b - c

至:

x = a.astype(float) - b.astype(float) - c.astype(float)

这是行不通的,因为int没有astype方法。错误现在看起来是这样的:

Foo中的文件"/home/engine.py",第165行lower_array[t].astype(float((/num_values.astype(floast(AttributeError:"NoneType"对象没有属性"astype">

因此,我最终得到:

x = a.astype(float) - b.astype(float) - float(c)

这一切都是非常繁琐和令人讨厌的强制转换,并且使得代码无法读取。

奇怪的是,这三个数组都被实例化为numpy数组,即:

a=numpy.array(_a)
b=numpy.array(_b)
c=numpy.array(_c)

当我要求代码将所有三个变量的类型输出到stdout时,它们都会说。然而,下一行代码爆炸并转储,称"属性错误:'NoneType'对象没有属性'astype'">

我无法理解静态代码分析器是如何确定类型的——除了numpy.ndarray类型——因为Python使用鸭子类型。因此,类型可以动态更改。但这里的情况并非如此;所有三个var都被标识为numpy.ndarray类型,但"z=a-b-c"失败。

有人知道这里发生了什么吗?

经过大量工作,答案是忽略linter。可读代码是对象,而不是满足linter的代码。

相关内容

最新更新