普段の自分やとここで「あーもうわけわかめ、やーんぺ」ってなるんやけど、
ちょっと頑張ってすすんでみる。
てか、わからんことは無視や、無視♪
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 件のコメント:
コメントを投稿