Python Tips: 「Code Like a Pythonista」から

Pycon 2007 の発表の資料に「 Code Like a Pythonista: Idiomatic Python 」というものがあります。いわゆる Python のイディオムを紹介したものです。 最初に PEP 20 ――「 Zen of Python 」の紹介から始まり、その後さまざまな具体的なアイデアがたくさん紹介されています。

今回はこの「 CodeLike a Pythonista 」の中から PEP 20PEP 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

以上です。