Pages

Monday, May 15, 2006

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 修一修再問問原作者對這種語法的看法吧


This article was originally posted on this site.

1 comment:

  1. 上面提到的幾個 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...

    ReplyDelete