サーバサイドでパーサを動かしたいのでjavascriptで書いたパーサを移植した
去年までならperlで書いたところだが、appEngineが出て自分の中でのpythonの重要度がとても高くなったのでpythonモジュールに
http://code.google.com/p/sorrex/source/browse/trunk/py/sorrex
とりあえず動くところまでで、詳しいテストは終わってないが、とりあえず忘れないうちにメモを
文字コード周りは
スクリプト自体はutf-8で書いて、読み書きにはそれぞれのエンコーディングを指定するのが楽
例えばsjisとutf-8のファイルを読んで、utf-8で書き込みだと
import codecs txt1 = codecs.open( "utf8.txt", 'rU', encoding='utf-8').read() txt2 = codecs.open( "sjis.txt", 'rU', encoding='cp932').read() codecs.open('newfile.txt', 'w', encoding='utf-8').write( txt1 + txt2 )
のように('rU'は改行統一オプション)
クラス定義、継承
#定義 class A: def __init__(self): self.name = 'A' #継承 class B(A): def __init__(self): self.name = 'B' #親コンストラクタを呼び出し class Adash(A): def __init__(self): A.__init__(self) self.name += 'dash' #オーバーライトしないなら親要素のものを引き継ぐ class C(A): def dummy_func(self): pass class Cdash(C): def __init__(self): C.__init__(self) cdash = Cdash() print cdash.name #->A
配列へのアクセスがタイト
arr = [] i = 0 arr[i] = 'hoge' #↑エラーになる arr = [] arr.append['hoge']
連想配列も同じく
arr = {} hoge = arr['hoge'] #↑エラー arr = {} if arr.has_key('hoge'): hoge = arr['hoge']
型もタイト
str = 'id' + 1 #エラー str = 'id' + `1`
存在しない変数へのアクセスもエラー
class A: def __init__(self): self.name = 'A' a = A() print a.namae #エラー
配列に入れた文字列を連結
arr.append('ho') arr.append('ge') ''.join( arr )
グローバル変数への代入には宣言が必要
str = 'hoge' def func_a(): str = 'foo' def func_b(): global str str = 'bar' func_a() print str #->'hoge' func_b() print str #->'bar'
連想配列とプロパティはもちろん等価じゃない
arr = {} arr['foo'] = 'bar' print arr.foo #エラー
arr = {} arr['1'] = {} arr['1']['2'] = 'hoge'
のようにアクセスする
イテレータを超多用するが、
arr = [a, b, c] for item in arr: print item #->a #->b #->c
indexが欲しいときはxrangeで
arr = [a, b, c] for i in xrange( len(arr) ): print arr[i] #->a #->b #->c
逆順が欲しいときは
arr = [a, b, c] for i in xrange( len(arr) - 1, -1, -1 ): print arr[i] #->c #->b #->a
のように
一日触ったら大体慣れる程度には似てる言語だと思う
エラーが明確になるのはいいね
簡単なスクリプト書くのもperlからpythonへ移行しよう