最初のお題 CRUD - Python 版

 

Google App Engine のあまりのスケールの大きさに、衝撃を通り越して一気に脱力してしまいました。 いったい、このサービスに登場する Python というのはどんな言語なのでしょうか。 これを確かめるために CRUD を書いてみました。

実行サンプル

$ python --version
Python 2.5.1
$ chmod +x crud.py
$ ./crud.py
CRUD> insert "United Kingdom" => "London"
CRUD> insert "Japan" => "Osaka"
CRUD> select ".*"
United Kingdom => London
Japan => Osaka
CRUD> insert "Japan" => "Tokyo"
Japan は既に存在します。
CRUD> update "Japan" => "Tokyo"
CRUD> select ".*"
United Kingdom => London
Japan => Tokyo
CRUD> delete "japan"
japan が見つかりませんでした。
CRUD> delete "Japan"
CRUD> select ".*"
United Kingdom => London
CRUD> exit
$ 

ソースコード

crud.py
#!/usr/bin/python
# coding: utf-8

import sys
import re

class CRUD(object):
    def __init__(self):
        self.hash = {}

    def insert(self, arg0, arg1):
        h = self.hash
        if h.has_key(arg0):
            raise Exception, arg0 + ' は既に存在します。'
        h[arg0] = arg1

    def select(self, arg0):
        h = self.hash
        p = re.compile(arg0)
        for key, val in h.iteritems():
            if p.match(key):
                print key + ' => ' + val

    def update(self, arg0, arg1):
        h = self.hash
        if not h.has_key(arg0):
            raise Exception, arg0 + ' が見つかりませんでした。'
        h[arg0] = arg1

    def delete(self, arg0):
        h = self.hash
        if not h.has_key(arg0):
            raise Exception, arg0 + ' が見つかりませんでした。'
        del h[arg0]

def parse(s):
    p0 = re.compile('^$')                                       # CRUD> 
    p1 = re.compile('^([a-z]+).*$')                             # CRUD> cmd .....
    p2 = re.compile('^([a-z]+)$')                               # CRUD> cmd
    p3 = re.compile('^([a-z]+)\s+"([^"]+)"$')                   # CRUD> cmd "arg0"
    p4 = re.compile('^([a-z]+)\s+"([^"]+)"\s*=>\s*"([^"]+)"$')  # CRUD> cmd "arg0" => "arg1"
    s = s.strip()
    r = p0.match(s)
    if r:
        return { 'cmd': '' }
    else:
        r = p1.match(s)
        if r:
            if   r.group(1) == 'exit':
                r = p2.match(s)
                if r:
                    return {
                        'cmd': r.group(1)
                    }
            elif r.group(1) == 'select' or r.group(1) == 'delete':
                r = p3.match(s)
                if r:
                    return {
                        'cmd' : r.group(1),
                        'arg0': r.group(2)
                    }
            elif r.group(1) == 'insert' or r.group(1) == 'update':
                r = p4.match(s)
                if r:
                    return {
                        'cmd' : r.group(1),
                        'arg0': r.group(2),
                        'arg1': r.group(3)
                    } 
    raise Exception, '文法エラーです。'

crud = CRUD()

while True:
    try:
        r = parse(raw_input('CRUD> '))
        if   r['cmd'] == 'insert':
                crud.insert(r['arg0'], r['arg1'])
        elif r['cmd'] == 'select':
                crud.select(r['arg0'])
        elif r['cmd'] == 'update':
                crud.update(r['arg0'], r['arg1'])
        elif r['cmd'] == 'delete':
                crud.delete(r['arg0'])
        elif r['cmd'] == 'exit':
                sys.exit()
        elif r['cmd'] =='':
                pass
    except Exception, e:
        print e