konbu's blog

PHP/Ruby/Python あたりが仕事で使っている言語です。プログラミング、学習や教育ネタを書いていきます。

EffectivePython その 1

EffectivePython を読んでいて、なるほどなぁと思う部分を書き残しておく。

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

for と while ループの後の else ブロックは使うのを避ける

自分の文化にはそもそもこの仕様が無かったため、全く使っていないのだけど、知識としては else が for や while で書けるのは知っていたために、使わないように覚えておきたい。 理由としては if や try の else と違い、正常に繰り返しが終了した場合に実行されるのが分かりづらいという事らしい。 確かに分かりづらい。気をぬくと忘れそう。

None を返すよりは例外を返す

結構処理を書く際に戻り値を返す以外の関数の終わり方が None になる事があり、その None チェックをするという事が発生していたので本当そうだなーと思った。

やっぱり戻り値の型が変わるのは良くないということだった。 そういう場合は何がダメなのかを考え、適切な例外を出すようにする。

キーワード専用引数で明確さを高める

Python 3 ではそういう機能があるみたいで、位置引数の後ろの引数を *, とし、その後にキーワード引数を設定すれば使えるらしい。

デフォルト引数としても機能するけど、*, の後に定義されているキーワード引数の部分を位置引数にするとエラーを吐いてくれる。

ただ、この機能は Python 2 には無いので工夫が必要との事。

python 2 で専用引数を使う場合

def func(a, b, **kwargs):
  c = kwargs.pop('c', False)
  b = kwargs.pop('d', False)
  if kwargs:
    raise TypeError('Unexpected **kwargs: %r' % kwargs)
  # ...

pop 使ってるのは想定引数で辞書が空にならない場合、本来定義したい引数ではないモノが入力されても検知できるようにしている。 本来の処理が始まるまでに数行必要だけど、引数が長くならないのは非常に見易く感動した。 今後是非使って行きたいレベル。

休み中に全部読みきるつもりだったけど意志が弱く体調が良くなかった (PM 2.5 とかで) ので読みきれなかった。