PHP の pear で色々コードを書いてきたのですが、composer に移ってからよく分からなくなったので Python に浮気しました。
折角なので新鮮な気持ちが残っている間に、感じた事を徒然なるままに書き綴ります。
習作
MIDI(SMF)ファイルをダンプするクラス。
細かい修正を抜きにして基本部分は4時間くらいで移植出来ました。Python 凄い。
移植ツール
-
http://sourceforge.net/projects/php2py/
- 結構間違えるけど、機械的な変換をそこそこやってくれて便利。
- でも多分、このレベルのなら自分で自作して改善してける気がする。
-
http://taichino.com/programming/947
- phc で PHP をパース出来るらしい。
- phpの構文木から Python のコードを自動生成するのが良さそう。
学習した事
- unpack が色々違う
- フォーマット文字列が PHP と違う。(流派とかある?)
- 戻り値の1つ目から使う。(PHP では2つ目から)
- new は使わない。a = Klass() で OK
- print がデフォルトで改行を付けて、第二引数で end="" を付けるのが面倒。
- sys.stdout.write なら改行付かないし fp で sys.stdout 部分を切り替えられて便利。
- print_ = partial(print, end="") でカリー化できる
- クラスメソッドの第一引数で self を受け取るのが手間かかって面倒
- クラスメソッドを _ で始めるとプライベートになるらしい。
- 例外は raise Exception("エラー文言") で OK。Exception を継承してもよし。
- PHP の list($a, $b) = $arrayVal が便利だけど、Python は a, b = arrayVal でもっと簡単
- is_null ないけど == None で比較すれば良いし、isset の代わりに has_key がある(但し当然 null の扱いに注意)。
- (追記 2014/11/6) == None じゃなく is None を使うべき。
- (追記 2014/11/6) has_key でなく in を使おう
- 日本語変換でパイプやリダイレクトを使うとエラーになる
- Python2系のstdoutは None(=ascii)なので PYTHONIOENCODING 環境変数で明示的に指定する。
UnicodeEncodeError: 'ascii' codec can't encode character u'\u3048' in position 0: ordinal not in range(128)
- Python2系のstdoutは None(=ascii)なので PYTHONIOENCODING 環境変数で明示的に指定する。
- 文字列フォーマットは % でなく str.format を使う。
- str % (a,b) でなく str.format(a,b)
- 通常の連想配列は PHP と違って順序を持たないけど、collections.OrderedDict を使うと順序を持たせられる。
- 初期化の時の順序だけ維持しない事に注意。後から a[key] = value と追記したものは大丈夫。
感じた事
- while(n--) がかけなくて勿体ないお化けが出そう。そもそも n-- が駄目。
- for (.. ;.. ; ..) が出来ないので、ループ条件が分かりにくくなる気がする
- 配列や連想配列を for で回すのに enumerate や items を呼ぶのは、シンタックスシュガーが欲しい気もする。
- 行末に ; が要らないけど、手が勝手に入力するので抑えるのが大変。$ を付けないのは慣れた。
- インデントはあまり気にならない。が、emacs の php-mode は else を1文字上に上げるっぽく、移植時にいちいち修正するの面倒。
- switch 文が使えないけど、break 忘れで酷い目に合うより elif 使った方がいいと思う。ただ、break をわざと書かずに制御するテクを使ってる場所の移植がちょっと面倒。
ちなみに、もう全部違和感なくなりましたw