比较函数作为属性的Python代码检查器

5 投票
3 回答
553 浏览
提问于 2025-04-16 14:35

我有时候会花很多时间去找我代码里的小错误……虽然我通常会用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代码检查工具可以指出这个特定的问题呢?

3 个回答

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() 方法,而不是依赖于在原地调用方法和比较,这样就避免了你现在遇到的问题。

0

@Mike Pennington 我想先说,我也经常遇到这个问题 -.-

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

我觉得这很难发现的原因是,你并不总是知道你正在调用方法的变量是什么类型。比如,我有两个类。

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' 类型。

补充:我指的是静态分析...

撰写回答