先日のFaceBookのPythonグループに投稿されたリンクから。
10 Most Common Mistakes that Python Programmers Make
上記の投稿を見ていて知らない部分もあったことから忘れないためのメモです。
#1 デフォルト値の扱いについて
関数の引数のデフォルト値が評価されるのは、関数が定義された時の一度だけで、 尚且つmutableだよというもの。
#2 クラス変数について
クラスオブジェクトそれぞれに名前と値の辞書が定義されています。
継承関係にあるクラスの場合、下位から上位に向かって名前を検索するため、 派生クラスで未定義の場合、上位クラスから検索し値を取得しますが、 派生クラスで同名で定義することで、派生クラスに新たなオブジェクトが定義され辞書に登録されます。
そのため上位クラスなどに影響を与えないよというもの。
#3 例外の取り扱いについて
複数の例外をキャッチする例外ブロックでは、キャッチする例外をタプルで定義し、 また、例外のインスタンスは"as"キーワードを使いましょうというもの
#4 スコープについて
私にはうまく説明出来ませんが、サンプルの場合"global"を使うと問題ないし、そもそもそういったコードは書かないので、
とにかくそういうコードは書かないのがいいですねというもの。
#5 繰り返し中のリストの変更について
どの言語でもリスト等の配列を繰り返し中に、オブジェクトの削除を行いたくなります。
でも、Pythonでは内包表記を使えば、こんなにエレガントになるんだ!というもの。
#6 クロージャ内の変数について
実行時バインディングによる問題。 呼び出された時にはすでにループが完了していて"i"には最終的な値がセットされているためというもの。
リストを生成する内包表記はリストを生成するため上記のような問題が起きますが、このような場合タプルで生成することでジェネレーターとして生成されるため本来の目的にかなった動作になります
>>> def create_multipliers():
... return (lambda x : i * x for i in range(5))
>>> for multiplier in create_multipliers():
... print multiplier(2)
...
#7 循環参照しているモジュールの依存関係
互いのモジュールで数珠つなぎ的に参照し合うことは稀にあります。個人的にも大抵同じような解決方法をしてきましたが、遅らせることが出来るなら遅らせようというもの?
#8 名前の衝突
名前の衝突というものはよくあることです。
#9 Pythonの2とPython 3の違いで
未だにPythno3を使っていないのでわかりませんが、例外はスコープを超えてアクセス出来ないためというもの。
#10 delの誤用
インタプリタ終了時に後始末を行う必要が今までないのでわかりません。。