2017-09-14 13 views
0

これは以前に尋ねられたかどうかはわかりませんが、私はUNIX SHELLパイプラインを模倣するためにPythonの "set oriented"のような構文をどのように実装できますか? 特に、レコードのストリームを生成、変更、または使用できる「プレーン・パイソン関数」の使用方法は、「。」を使用して一緒に貼り付けることができます。オペレーター。Python JQUERYがUnixシェルパイプラインを模倣するような構文

UNIXプログラムのようなPythonの関数を仮定して単純な例:UNIXで

我々は行うことができます。

ls | egrep '^a' | wc -l 

を 'A' で始まるカレントディレクトリ内のファイルをカウントします。私はそれが可能でLSを接続するようになります明白なグルーコードを省略している

@pipeline 
    def ls(): 
     for file in glob.glob("*"): 
      yield file 

from unixtools import * 
    ls().egrep('^a').wc(countLines=True) 

とLSの実装は、発電機のように考えられます。いかが パイプラインの他の "コマンド"。

@パイプラインはデコレータを使用してプレーンなPython関数をパイプラインプロトコルのメンバーに変換しようとする試みです。

私は、これが逆に書くためにあなたを強制的に読みにくくているのpythonの伝統的な構文と、より多くのエラーが発生しやすいを使用して行うことができます実現:

 wc(countLines=True,input=egrep("^a",input=ls())) 

私たちはのpythonの実装を検討することができると思いそれを把握するためには、フキダメ

+0

あなたが探している用語は[**流暢なインターフェイス**](https://en.wikipedia.org/wiki/Fluent_interface)です。 –

+0

メソッドチェーニングが可能で、デコレータも可能です。オーバーライドされたDSL |オペレータ[可能](https://github.com/JulienPalard/Pipe)、何が問題なのですか? – myaut

+0

情報ありがとうございます。 Google検索結果:「パイプ:Pythonのインフィックス構文」: http://pypi.python.org/pypi/pipe/1.3 (https://mdk.fr/blog/pipe-in​​fix-syntax-for- python.html)close –

答えて

0

明らかに、pythonパイプパッケージは私が求めていたものに非常に近く、私はそれを認識していませんでした。

パイプパッケージのドキュメントが私の述べた問題に対して非常に直感的ではなかったので、私自身の質問に答えています。特に、完全なUNIXシェルパイプのセマンティクスを実装することになります。結局のところ、いくつかの一般的なUNIXの仕掛に関するいくつかの未解決の疑問が存在します。

@Pipeデコレータを使用して、プロデューサをPythonジェネレータとして作成できます。注意して 、プロデューサーのこのタイプは、唯一のパイプラインの最初のメンバーになることができます:

@Pipe 
def transformer(iterable, arg=2): 
    for x in iterable: 
     if x % arg == 0: yield x*2 
:Unixの中

from pipe import Pipe 
@Pipe 
def producer(arg=10): 
    for x in range(arg): 
     yield x 

と同様に、あなたはその入力を変換し、出力を生成することが予想される変圧器を、定義することができます

Unixシェルとは異なり
producer() | transformer() 

、このP:

我々は、Unixシェルのパイプラインの似ている、プロデューサー、「パイプ」構文を使用して変圧器をフックすることができます第二に、

producer() | transformer() | consumer() 

興味深いことに:

@Pipe 
def consumer(iterable): 
    for x in iterable: 
     print(x) 

となりましフックアップが期待通りに動作します:あなたは、その入力を消費し、何かを印刷し、消費者が、書き込むことができ、出力;-( としてroducesは何もありません以上のパイプラインの要素は、私たちは括弧を省略し、単にパイプ関数の名前を使用することができます

producer(10) | transformer | consumer 

私が気に入ったもう一つの特徴を、Dここでは」SHELLのと同じです]で文書:パイプライン内の次の要素に 『パイプ」この場合

[1,2,3,4] | transformer | consumer 

[1,2,3,4]ジェネレータが生成されている可能性があり、それがされている値のシーケンスとして解釈されます』。

そして、私たちはもちろん、パイプラインの結果を収集することができます。

a = [1,2,3,4] | transformer | consumer 

そして今は、最終的にいくつかのケースでは、「パイプ」をどのように扱うかは非常に明白ではありません。

それは明確ではありませんSHELLのstdoutマージと同等の処理方法:

(echo today ; date) | wc 

"cat"プロデューサ、abすべてのiterable入力を連結するには?

cat(echo("today"),date()) | ... 

それはUnixシェルのように、パイプラインのほんの一部の要素を消費して、別の機能を続行するかも明らかではない。

cat /etc/passwd | (read line ; cat) 

この場合、読み取りは、最初の消費しますラインと猫は残りの部分を見る。 "("と ")"記号をオーバーロードできますか?

関連する問題