與 Python shell-like pipe 類似的東西

Posted by TJ Wei on 星期五, 4月 22, 2011 with No comments
多年前寫了一個 python shell like pipe (minipipe),主要是可以讓 python 有像是
ls|wc
ls|tail(n=5)|sort
cat/"*.py"|grep("def")
grep("pipe")/"*.py"/"/usr/include/*.h"
grep("^a","aaa\nbbb\nccc\nabc".splitlines(), open("text","rb"))
這樣的語法。
最近看到一個極為類似的東西,Pipe: Infix syntax for Python
我的 minipipe 其實比較複雜一點,原因是
  • 為了能直接打 ls 就能在 interactive shell 中直接顯示結果,也可以寫成 ls|wc 而不是 ls()|wc
  • 多了 /"*.py" 這樣的運算
  • 能和吃 iterator 的普統函數直接作用(也就沒有加上 @pipecmd decorator 的)。原因在於minipie 的傳回值都是 pipe object  (PipeCmd),即使碰到普通函數,會自動把魔法傳下去。
 類似的還有 python-pipeline/ 這個。
以相似度來說,我的 minipipe 和 ASPN Recipe: Shell-like data processing 其實原理和用法上都有差異。 Recipe 中的 cat, ls 等等,是個別的 class。而 minipie 主要的概念是 class 包函數(這個概念是 OO 語言中的常見方式),運算的傳回值都是
Pipe: infix 用法和原理類似 minipipe 。差異是,他傳回的值是 iterator 而不是 pipe object。好處就是,傳回值預期的類型。缺點是,一旦變成普通物件,就失去魔法了。他的 | 就是另外一種 function call 的語法,一些語言一樣 function calling語法 (haskell 太久沒用忘了, F# 是 |>) 。
python-pipeline 程式碼比較複雜,不過看起來用法差不多,原理沒仔細看。
回頭看了一下自己以前寫的程式碼,看起來還是很醜。
Categories: