如何检查包含库的python代码?

时间:2014-02-27 20:59:29

标签: python numpy

我正在研究一些机器学习代码,今天我因为简单的错字而丢失了大约6个小时。

就是这样:

numpy.empty(100,100)

而不是

numpy.empty([100,100])

由于我不习惯numpy,所以我忘了括号。代码愉快地捣乱了数字,最后,在将结果保存到磁盘之前,它就崩溃了。

只是为了把事情放在透视中我在shell中的远程机器上编码,所以IDE实际上不是一个选项。我也怀疑IDE会抓住这个。

这是我已经尝试过的:

  1. 运行pylint - 井pylint有点工作。在我禁用错误和警告之后,它甚至似乎都很有用。但pylint对导入的模块存在严重问题。正如official bug tracker上所见,开发者知道它,但不能/不会做任何事情。建议的解决方法,但忽略整个模块,在我的情况下无济于事。
  2. 正在运行pychecker - 如果我使用我犯的错误创建代码段,pychecker报告错误 - 与python解释器相同的错误。但是,如果我在实际源文件(~100 LOC)上运行pychecker,它会报告其他错误(未使用的变量,未使用的导入等);但是错过了那条错误的numpy线。
  3. 最后我尝试了pyflakes,但它比pychecker / pylint组合的检查更少。

    那么有没有可靠的方法可以提前检查代码?没有实际运行它。

2 个答案:

答案 0 :(得分:2)

您使用unit tests吗?真的没有更好的方法。

答案 1 :(得分:2)

具有更强类型检查功能的语言可以使您免于特定错误,但不能避免一般错误。传递静态类型检查有很多方法可以解决。因此,如果您的计算需要很长时间,那么采用以下策略是有意义的:

  1. 在小型示例(运行在几秒钟或几分钟内)上端到端测试代码,然后再运行耗费数小时的大数据。

  2. 构建长时间运行的计算,以便将中间结果保存到计算中适当位置的磁盘上的文件中。这意味着当出现问题时,您可以解决问题并从上一个保存点重新开始计算。

  3. 运行交互式解释器中的代码,以便在发生异常时返回到交互式会话,使您有机会使用事后调试会话恢复数据。例如,假设我有一些长时间运行的计算:

    def work(A, C):
        B = scipy.linalg.inv(A) # takes a long time when A is big
        return B.dot(C)
    

    我从交互式解释器运行它,它引发了一个异常:

    >>> D = work(A, C)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "q22080243.py", line 6, in work
        return B.dot(C)
    ValueError: matrices are not aligned
    

    哦不!我忘了转置C!我是否必须再次进行A的反转?如果我拨打pdb.pm

    >>> import pdb
    >>> pdb.pm()
    > q22080243.py(6)work()
    -> return B.dot(C)
    (Pdb) B
    array([[-0.01129249,  0.06886091, ...,  0.08530621, -0.03698717],
           [ 0.02586344, -0.04872148, ..., -0.04853373,  0.01089163],
           ..., 
           [-0.11463087,  0.15048804, ...,  0.0722889 , -0.12388141],
           [-0.00467437, -0.13650975, ..., -0.13894875,  0.02823997]])
    

    现在,与Lisp不同,我不能只是设置正确并继续执行。但至少我可以恢复中间结果:

    (Pdb) D = B.dot(C.T)
    (Pdb) numpy.savetxt('result.txt', D)