Pythonの勉強

ちょっとPythonを触ってみたくなったので、しばらく勉強してみます。

基本的な文法とかは、公式ドキュメントと「みんなのPython」読んで一通りさらってみました。

と、いうわけで実際に書いてちゃんと理解しよう。
個人的にはフレームワークっぽいものを自分で書いてみると頭にスッと入ってくるので今回もそうします。


例えば、

index.py
 /controller
  index.py
  test.py

みたいなディレクトリ構造があったとして、
http://domain/test/hello
というURLにアクセスがあった場合は、index.pyにrewriteしてtest.pyのhello()を実行するようにしたい。

test.py

class Test:
  def __init__(self):
    self.msg = "This is Test controller."

  def hello(self):
    print "Hello!" + self.msg

index.py

import os
import imp

controllers = ('index', 'test')

uri = os.environ['REQUEST_URI'].split('/')
ctl = 'index'
act = 'index'
param = ''
if uri[1] != '':
  ctl = uri[1]
  if len(uri) >= 3:
    act = uri[2]
  if len(uri) >= 4:
    param = uri[3:]

print "content-type: text/html; charset=utf-8\n\n"
if not ctl in controllers:
  print "error!"
else:
  moduledir = os.path.join(os.getcwd(), "controller")
  f,n,d = imp.find_module(ctl, [moduledir])
  m = imp.load_module(ctl, f, n, d)
  ctl = ctl.capitalize()
 try:
    eval('m.' + ctl + '().' + act + '("' + "\",\"".join(param) + '")')
  exception TypeError:
    print "TypeError exception!"

CGIとして実行させたので、Content-Typeを最初に出力してます。
まず、実行可能なコントローラを登録する。
で、URIを分割してコントローラとアクションに分ける。
コントローラに従ってモジュールを読み込んで、アクションを実行。という感じで。
アクション以降のURIは、アクション関数の引数に渡すようにしてます。
http://domain/にアクセスがあった場合は、indexコントローラのindex()を実行。
全然エラー処理とかしてないけど、これしか書かずに処理の振り分けができるのはすごい。


読み込んだモジュールのクラスインスタンスと関数を動的に実行するのってどうするのがいいんだろ。。。
いろいろ調べてみたけど、どうもいいやり方が見つからなかった。
とりあえず、evalでやってみたけど、JavaScriptみたいに速度遅いとかあるのかな。
あと、実行する関数に渡す引数の数が、定義されている数より多い場合、例外出してるけどよしなに実行する方法は無いかなー
JavaScriptだと引数の数多くても大丈夫だけど、そういうのPythonでできないかな。と思ったら「**kwds」というのがあるらしいので、ちょっと調べてみる。