5

我偶尔会花大量时间在我的代码中追踪brainfarts ......虽然我通常对它运行pylint,但有些事情会跳过pylint。我最容易忽略的问题是这个......

# normally, variable is populated from parsed text, so it's not predictable
variable = 'fOoBaR'
if variable.lower == 'foobar':
    #       ^^^^^<------------------ should be .lower()
    do_something()

pylint 和 Python 都没有对此嗤之以鼻……是否有可以标记此特定问题的 python 代码检查工具?

4

3 回答 3

0

@Mike Pennington我只想说我也经常遇到这种情况-.-

@eyquem 'lower()' 是一个函数。'lower' 是一个函数指针(如果我没记错的话)。Python 将允许您尝试运行此代码,但它不会调用该函数。

我认为这很难抓住的原因是你并不总是知道你正在调用方法的变量的类型。例如,假设我有 2 节课。

class Foo()
   def func(self):
      #do stuff
      pass

class Bar()
   self.func = "stuff"

如果您的代码中有一个函数,该函数接受一个参数 'baz',如下所示:

def myfunction(baz):
    print baz.func

def myfunction(baz):
    baz.func()

根据 baz 的类型,其中任何一个都可能有效。但是,实际上没有办法知道 baz 是 'Foo' 还是 'Bar' 类型。

编辑:我的意思是静态分析......

于 2011-05-12T15:53:15.067 回答
0

您如何建议代码检查器验证这一点?这是完全合法的语法。与其检查这种错误,不如养成使用更好模式的习惯。

代替:

variable = 'fOoBaR'
if variable.lower == 'foobar':
    #       ^^^^^<------------------ should be .lower()
    do_something()

做这个:

variable = 'fOoBaR'
sane_variable = variable.lower()
if sane_variable == 'foobar':
    do_something()

这样,您总是明确地调用.lower()您要比较的值,而不是依赖于就地方法调用和比较,这会导致您遇到的陷阱。

于 2011-05-12T18:51:34.440 回答
0

这是pylint 票 #65910

于 2011-05-18T17:52:13.510 回答