【问题标题】:Are there tools that can spot errors like this one?有没有工具可以发现像这样的错误?
【发布时间】:2011-04-15 17:08:27
【问题描述】:

我这周在我的代码中发现了以下错误:

import datetime

d = datetime.date(2010,9,24)
if d.isoweekday == 5:
    pass

是的,应该改为 d.isoweekday()。

我知道,如果我有一个测试用例,我就会得救。 将函数与 5 进行比较并不是很有用。哦,我不是为此责怪 Python。

我的问题:有没有工具可以发现像这样的错误?

【问题讨论】:

  • “如果我有一个测试用例”。这不是你问题的答案吗? “编写单元测试。”
  • @S.Lott 我为这个答案掩饰了自己。所以不行。 :)
  • 你没有抓住重点。鉴于 (a) 没有测试和 (b) 你有答案,你将不得不开始编写测试。
  • 如果我有足够的声望来编辑那个问题,我本可以改正错字。

标签: python


【解决方案1】:

作为替代方法,大多数 Python 项目都经过单元测试和系统测试。如果两者都有(甚至只是单元测试),您会发现您的问题以及几乎所有其他问题。

正如 dekomote 所说,这在语法上是有效的。 Python 不是静态类型的,因此不能将其作为错误捕获。最多只能是一个警告。

编辑:Python 是强类型的,只是在运行时检查类型。

【讨论】:

  • -1 python 是强类型的。它不是静态类型的。这不是一个小区别。此外,它甚至不应该是一个警告,因为比较是完全有效的。
  • 感谢指正。好吧,除非工具能够在不运行程序的情况下模拟执行,否则它不会有太大变化。否则只能是猜测。
  • +1 是唯一一个推荐单元测试的答案(S. Lott 在 cmets 中就在上面)
  • 仅仅因为它完全有效并不意味着它不值得警告。在 C 语言中,if (x=false) 也是完全有效的,但我们都很高兴编译器会在它出现在我们的代码中时向我们发出警告。
  • @Darryl:C 是静态类型的。并不意味着不能有警告,但警告可能不正确。
【解决方案2】:

查看 pylint 或许可以得到。它确实发现了很多错误。

【讨论】:

  • 那是因为这里没有错误。 d.isoweekday == 5 是一个有效的声明。
  • @dekomote 它没有按照 Eddy 的预期工作,所以这是一个用户错误,这是 linter 应该捕获的。并不是说他们可以捕获所有内容,但说没有错误是不正确的。
  • @dekomote:你错过了 pychecker 和 pylint 的重点。它们不是用来查找无效的 Python:它们是用来查找人们犯的错误。例如,他们可以告诉您,您导入了一个模块但从不使用它,这是完全有效的 Python,但可能不是您想要的。
【解决方案3】:

嗯,这在 python 本身中并不是一个错误,因为在 Python 中,函数是可调用对象。您可以通过实现__call__ 使任何对象可调用。所以 d.isoweekday == 5 是有效的陈述。这将是错误的。

至于其他错误,我建议检查 pyflakes - http://divmod.org/trac/wiki/DivmodPyflakes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多