2009年11月11日水曜日

pythonの値としての関数、例外処理など

from apptools import StreamApp は、結局謎なまま。

普段の自分やとここで「あーもうわけわかめ、やーんぺ」ってなるんやけど、
ちょっと頑張ってすすんでみる。
てか、わからんことは無視や、無視♪

scanfile.py

#!C:/Python25/python

def scanner(name, function):
file = open(name, 'r')
while 1:
line = file.readline()
if not line: break
function(line)
file.close()


commands.py

#!C:/Python25/python
from scanfile import scanner

def processLine(line):
if line[0] == '*':
print "Ms.", line[1:-1]
elif line[0] == '+':
print "Mr.", line[1:-1]
else:
raise 'unknown command', line

scanner("../res/people.txt", processLine)


お、動いたぞ!

わかったこと
・from "ファイル名(.pyは抜く)" import "関数名" で、他のファイルに定義されている関数定義をもってこれる。Javaのimportみたいなもん。
 ⇒①scanfile.pyに他に実行されるような文があったらどうなる?
・関数を値として取ることができる。特別な記法は無いのでとっても直観的。第一級の値ってやつやね、懐かしい。
 ⇒②引数の数や値が違ったら例外でも起こるのかな?
・raiseで例外を起こすことができる。Javaのthrowみたいなもん。例外に型はないのかな?

①scanfile.pyに他に実行されるような文があったらどうなる?
scanfile.pyに print 'hello world' を足すと、 commands.py の処理の最初で実行されている模様。
つまり、from hoge ってやると hoge.py がとりあえず実行されて、そのあと import foo で foo の値だけ持ってこれるって感じっぽいね。

②引数の数や値が違ったら例外でも起こるのかな?
不必要な引数をprocessLine に足してみると・・・

Traceback (most recent call last):
hello world
File "C:\eclipse35Python\workspace\test\src\commands.py", line 12, in
scanner("../res/people.txt", processLine)
File "C:\eclipse35Python\workspace\test\src\scanfile.py", line 10, in scanner
function(line)
TypeError: processLine() takes exactly 2 arguments (1 given)

おおお、例外出た!(err出力とout出力が混ざってるから行がめちゃくちゃ)

つまり、関数型言語でよくあるようなカリー化は行われてないっぽいね。

楽しい♪

---

Blogger、WYSIWYGな機能がもっと増えたら使いやすいのに。アイテマイズとか欲しいよー、TracのWikiぐらい便利になってほしい。

0 件のコメント:

コメントを投稿