lambda 的改進 2
※ 引述《letoh (@heaven)》之銘言:
會去玩這個主要是因為要改 python 的 Expect 模組
我只試了 perl 跟 python
perl 的部份我沒仔細去看 python 的話是直接用 pty 實作
應該不算 binding 只是提供類似 Expect 的語法
不過語法上 perl-expect 會比較接近原本的 Expect
直接移植的話比較簡單一點
python 的寫法就不太一樣了 例如在 expect 一堆 pattern 的時候
在 Expect 裡是這樣寫的
expect {
pat1 { action 1
} pat2 { action 2
}}
perl 寫起來很像
$exp->expect{
[ pat1 => sub { action 1 } ],
[ pat2 => sub { action 2 } ]
}
python 則是變成這樣
idx = exp.expect([pat1, pat2])
if idx == 0:
action 1
elif idx == 1:
action 2
是沒什麼不好 但看起來就是很怪
所以為了把它改的跟 Expect 語法比較像 才去試了 lambda 的用法
要套用的話就如我之前寫的那樣 現在算是改得差不多了 可以這樣寫
exp.expect([
[ pat1, “”"action 1″”"],
[ pat2, “”"action 2″”"]
])
當然還是會傳回 idx 供後續處理 可惜沒把 exp_continue 弄出來 (perl 有處理這個)
目前大致上是可以動了 但是 timeout handler 還是怪怪的 要再找一下問題在哪
另外 action 的寫法也有限制….因為 python 是用縮排來判斷 code block
如果 action 是多行的話 要這樣寫
exp.expect([
[’login’, “”"
for i in range(2):
logfile i, “get login prompt\r”
exp.send(”letoh\r”)”"”]
])
一定得從最左邊開始寫 縮排可以照樣縮 (第一層一定要在最旁邊)
然後換行要用 \r 如果一定要用 \n 的話要改用 \\n
看起來有點醜 所以也不一定要這樣寫 應該可以在別處定義好 handler
再傳進來…這個我還要再改一下
整個 trace 加上修改用不到幾分鐘 應該拜 python 語法簡潔之賜嗎@@
不過也因為改太快了 很多東西沒考慮完整 只是先讓它能動
而且目前要用舊的寫法也是大部份相容的
等我把 bug 修一修再問問原作者對這種語法的看法吧
May 15th, 2006 at 1:55 pm
上面提到的幾個 bug 都修掉了 現在 timeout handler 運作正常。另外也處理了一下 function handler 的使用,現在可以這樣
例如
def do_something(): pass
exp.expect([pat1, do_something])
如果要傳參數呢 那就沒辦法了 只能這樣寫
def send_pw(conn): conn.send(”password\r”)
exp.expect([’assword’, “”"send_pw(conn)”"”])
而且用 function 的話就沒有縮排的限制了,因為是直接去呼叫 function…