5

私はときどき、コード内の頭脳を追跡するのにかなりの時間を費やします...通常はそれに対して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

@マイクペニントン私は最初に私もこれにたくさん遭遇したと言いたいです-.-

@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

これはpylint チケット #65910 です

于 2011-05-18T17:52:13.510 に答える
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 に答える