2010-11-18 9 views
2

私は約the problemを知っていて、それを修正する方法を知っています。私は、既存のコードでこの問題を見つけるのを助けてもらいたいと思います。Python:変更可能なデフォルトの引数をキャッチ

つまり、このトラップが埋め込まれている場所をすべて見つけようとしているため、修正できます。

私を助けるツールはありますか?

+3

経験者の誰も、既定の引数としてリストまたは辞書を使用することはありません。あなたはそれを一度やります。今度は8時間と多くの涙が出て、もう一度やってはいけない;) –

+0

"このトラップが埋まっている場所をすべて見つけようとしています"誰がそれを葬った?この間違いを犯したプログラマーを見つけ、問題を説明してください。なぜ彼らは自分のコードを覚えて修正できないのですか? –

+0

@ S.Lott:合意され、編集されたタイトル。そして、私はこの問題について学ぶ前から自分のコードです。 – max

答えて

3

grepに問題がありますか?

grep "^\s*def.*=(\[\]|\{\}|set\(\))" 

これは、通常の犯人のほぼすべてを検出します。

自分の変更可能なクラスのインスタンスをデフォルト値として使用している場合は、それを個別にチェックする必要があります。

+0

関数定義が複数の行に分割されている場合はどうなりますか?限られた経験の中で、コード内を正しく検索するための正規表現は決して得られません。 – max

+0

@max:複数の行にまたがる関数定義の数はいくつですか?コードベースの大きさはどれくらいですか?これは一度だけの運動です。 grepを使って一つの行に完全ではない関数定義を見つけ出す必要があるなら、それは大丈夫です。あなたはこの仕事をもう一度やることはありません。 –

+1

@maxこれは古いと知っていますが、(まれな)複数行の亜種を見つけるには、これがうまくいくはずです。pcregrepはOSX上ではないが、Windowsの可用性についてはわかりません。 'find。 -name "* py" | xargs pcregrep -M 'def。+?\([^)] + [\ [{[]' ' – slinkp

10

Pylintには、変更可能な型のデフォルトの引数値についての警告があります。それはカスタマイズ可能なので、望むのであればこれを行うことができます。

+0

残念ながら、PylintがWindowsでActiveState Python 3.1を使用するのを見つけることができないようです。それが利用可能かどうか誰もが知っていますか? – max

関連する問題