1

Pythonから継続渡しスタイルをどのように促進できますか?

(正しい表現だと思います)


私のコードは乱雑になり始めていmapます。filterlambda

(lambda a,b: (lambda c:(lambda d: d*d)(c-b))(a*b))(5,6)

「パイプライン式」は、さまざまな言語で使用されています。たとえば、次のとおりです。

F#ソリューション (例: |>)

let complexFunction =
    2                            (* 2 *)
    |> ( fun x -> x + 5)         (* 2 + 5 = 7 *)
    |> ( fun x -> x * x)         (* 7 * 7 = 49 *)
    |> ( fun x -> x.ToString() ) (* 49.ToString = "49" *)

Haskellソリューション (例: dopipes )

 main = do
     hSetBuffering stdout NoBuffering
     str <- runEffect $
         ("End of input!" <$ P.stdinLn) >-> ("Broken pipe!" <$ P.stdoutLn)
     hPutStrLn stderr str

JavaScript (例: async.js ):

async.waterfall([
    function(callback) {
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback) {
      // arg1 now equals 'one' and arg2 now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback) {
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
    // result now equals 'done'    
});

ただし、この最後の戦略は、非同期関数の応答解決のためのものであることを理解しています (コールバック地獄を参照)。

処理のすべての段階を 1 つの Python 式/行で表すにはどうすればよいですか?

4

1 に答える 1

2

私の知る限り、Pythonにはそれを行うための標準機能はありません。

operator をオーバーライドするPipeというモジュールがあります|が、これは有害であると考えられます (セマンティクスを変更しながら operator をオーバーライドします)。

ただし、そのために単純なFluent インターフェイスを実装することはできます。次に例を示します。

class P:
    def __init__(self, initial):
        self.result = initial

    def __call__(self, func, *args, **kwargs):
        self.result = func(self.result, *args, **kwargs)
        return self

    def map(self, func):
        self.result = map(func, self.result)
        return self

    def filter(self, func):
        self.result = filter(func, self.result)
        return self

    def get(self):
        return self.result

x = P(2)(lambda x: x + 5)(lambda x: x * x)(lambda x: str(x)).get()
z = P(range(10)).map(lambda x: x * 3).filter(lambda x: x % 2 == 0).get()
print(x, list(z))       # prints 49 [0, 6, 12, 18, 24]
于 2015-03-20T09:51:14.053 に答える