app engine書いててよく使うコード片とか

class OwnershipError(Exception):
  def __init__(self):
    self.value = "OwnershipError"
class NotFoundError(Exception):
  def __init__(self):
    self.value = "NotFoundError"

とかエラーを定義して

def deleteItem(key, user):
  obj = db.get( db.Key.from_path( "Texts", key ) )
  if obj:
    if user == obj.user:
      obj.delete()
    else:
      raise OwnershipError
  else:
    raise NotFoundError
try:
  db.run_in_transaction(deleteItem, key, user)
  self.response.headers['Content-Type'] = 'text/plain'
  self.response.out.write("success")
  return
except NotFoundError, e:
  logging.info( e.value )
except OwnershipError, e:
  logging.info( e.value )

self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write("fail")

raiseするとトランザクションのなかでエラー処理しなくていいので嬉しい



def JST(time):
  return ( time + datetime.timedelta(hours = 9) ).strftime("%x %X")

日本時間に変換する
データストアのDateTimePropertyでauto_now = Trueやauto_now_add = Trueを指定して使うときに日本時間で格納する方法がわからなかったのでこれで出力時に変換している
毎回変換する必要があるってのはキモいのでなんとかしたいところ




文字列連結は、単純な

for word in words
  str += word

とするより

"".join( word for word in words )

のほうが速い




forでインデックスを使うときは

"".join(
        "<word"  + str(index) + ">" +
        words[index] +
        "</word" + str(index) + ">"
         for index, word in enumerate(words)
 )

みたいな感じで
db.StringListProperty()を上のようにタグにするときとかは便利




ちょろちょろとpython書いているがちょっと慣れてきた感がある
pydevのインデント関係の挙動が全然で困ってるが、それを差し引いてもずいぶん高速に書ける
右手の小指がつりそうになることがないのがいいな
rubyより先にこっちを触って、結果的にはよかったかもしれない