Pythonのちょっとしたこと

■複数行で記述したい場合
"abcdefghijkllmnopqrstuvwxyz"

"abcdefghijkllmn" \
    "opqrstuvwxyz"
("abcdefghijkllmn"
 "opqrstuvwxyz")
で記述できる


if isView and len(str) > 0 and item in items:
if (       isView
     and len(str) > 0
     and item in items ):

■式
  a < b and b < c は a < b < c と記述可能
前者のbは2回評価されるのに対し後者は1回

■オブジェクト同士の式で呼ばれる拡張比較メソッド
 a <  b は a.__lt__(b)
 a <= b は a.__le__(b)
 a >  b は a.__gt__(b)
 a >= b は a.__ge__(b)
 a == b は a.__eq__(b)
 a != b は a.__ne__(b)
 
 上記特殊比較メソッドが実装されていない場合はobject.__cmp__が呼ばれる

 *Noneとの比較は上記の拡張比較メソッドを呼ばない is や is not にて行うこと

■ブーリアンの比較
・Falseとの比較は not を使うこと
・数値のゼロ、空文字、要素数0の配列等はfalseとなる

■自作クラスをハッシュ値を使ったコレクション型(set, frozenset, dict)で使う場合
・object.__hash__(self)が必要
・__hash__()は__cmp__()__と__eq__()も揃って実装しなけらばならない
・変更可能なオブジェクトを定義してはならない
 (ハッシュ値が不変でなければならない)

■文字列の書式化
モジェロ演算子が使えるが今後仕様からはずれるらしいので使わず、string.format()を使う

"%d年%d月%d日 %s"%(2012, 10, 12, "晴れ")

"{0}年{1}月{2}日 {3}".format(2012, 10, 12, "晴れ")

■文字列の連結の注意
 +記号で文字列同士を連結する場合はループ内では使わないこと
 文字列はイミュータブルであり、テンポラリオブジェクトの大量生成を回避するため

buffer = ""
for name, value in items
  buffer += "  name={0}, value={1}".format(name, value)



temp = []
for name , value in items
    temp.append( "  name={0}, value={1}".format(name, value) )
buffer = "".join( temp )

■参照するパス
Pythonシェル上で下記を実行するとモジュール等を参照しに行くパスを見ることができる
>> import sys
>> sys.path

■クラス名とメソッド名を取得
import traceback
print( "****Class={}, Method={}".format(__class__.__name__, traceback.extract_stack()[-1][2]) )