javascriptからpythonへ移植したときのメモ


サーバサイドでパーサを動かしたいのでjavascriptで書いたパーサを移植した
去年までならperlで書いたところだが、appEngineが出て自分の中でのpythonの重要度がとても高くなったのでpythonモジュールに


http://code.google.com/p/sorrex/source/browse/trunk/py/sorrex
とりあえず動くところまでで、詳しいテストは終わってないが、とりあえず忘れないうちにメモを


文字コード周りは
スクリプト自体はutf-8で書いて、読み書きにはそれぞれのエンコーディングを指定するのが楽
例えばsjisutf-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へ移行しよう