比较函数作为属性的Python代码检查器
我有时候会花很多时间去找我代码里的小错误……虽然我通常会用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' 类型。
补充:我指的是静态分析...
0