Pycon 2007 の発表の資料に「 Code Like a Pythonista: Idiomatic Python 」というものがあります。いわゆる Python のイディオムを紹介したものです。 最初に PEP 20 ――「 Zen of Python 」の紹介から始まり、その後さまざまな具体的なアイデアがたくさん紹介されています。
今回はこの「 CodeLike a Pythonista 」の中から PEP 20 や PEP 8 に含まれていないもの、かつ、個人的に勉強になったものをご紹介します。原文にはここに挙げたよりもっとたくさんの例が載っていますので、興味がある方はそちらも見てみてください。
Docstring とコメントの使い分け
- Docstring は HOW TO ――使い方について説明する。
- コメント は WHY & HOW ――なぜなのか、どのように動くのかを説明する。
値の入れ替え → 一行で書く
○:
b, a = a, b
×:
tmp = a
a = b
b = tmp
文字列を連結して長い文字列を作る → join()
を使う
○:
''.join(words)
×:
result = ''
for s in words:
result += s
○:
''.join(fn(i) for i in items)
in
が使える処理 → in
を使う
○:
if key in d:
# do something
×:
if d.has_key(key):
# do something
辞書の初期値を入れるための処理 → get()
や setdefault()
を使う
○:
d = []
for (e1, e2) in data:
d[e1] = d.get(e1, 0) + e2
×:
d = []
for (e1, e2) in data:
if e1 not in d:
d[e1] = 0
d[e1] += e2
○:
lists = {}
for (e1, e2) in data:
lists.setdefault(e1, []).append(e2)
×:
lists = {}
for (e1, e2) in data:
if e1 in lists:
lists[e1].append(e2)
else:
lists[e1] = [e2]
2つのリストをいっしょに回す → zip()
を使う
○:
for (e1, e2) in zip(list1, list2):
# do something
リストが空かどうかの判定 → 判定文に変数そのものを入れる
○:
if items:
# do something
×:
if items == []:
# do something
ソートのルールをカスタマイズする → key
を使う
○:
def my_key(item):
return (item[1], item[3])
to_sort.sort(key=my_key)
モジュールの import
→ *
は使わず明示的に指定する
○:
import module
module.name
×:
from module import *
○:
import long_module_name as mod
mod.name
○:
from module import name
name
モジュールとしても単体のスクリプトとしても使うコード → if __name__ == '__main__'
で判定させる
○:
....
code
....
....
if __name__ == '__main__':
# script code
以上です。