0

[私はpython 2.7を使用しています]

関数に 1 つの出力を追加する小さなラッパー関数を作成したかったのです。何かのようなもの:

def add_output(fct, value):
    return lambda *args, **kargs: (fct(*args,**kargs),value)

使用例:

def f(a): return a+1
g = add_output(f,42)
print g(12)            # print: (13,42)

これは予想される結果ですが、指定された関数add_ouputが複数の出力を返す場合 (または出力を返さない場合) は機能しません。この場合、ラップされた関数は 2 つの出力を返します。1 つは初期関数のすべての出力を含み (またはNone出力を返さない場合)、もう 1 つは追加された出力を含みます。

def f1(a): return a,a+1
def f2(a): pass
g1 = add_output(f1,42)
g2 = add_output(f2,42)
print g1(12)            # print: ((12,13),42)   instead of (12,13,42)
print g2(12)            # print: (None,42)      instead of 42

これは、タプル型の 1 つの出力と複数の出力を区別できないことに関連していることがわかります。しかし、python のような動的言語でこれほど単純なことを実行できないのは残念です...

誰かがこれを自動的かつ適切に達成する方法についてアイデアを持っていますか、それとも私は行き止まりにいますか?

注:これが何かを変更した場合、私の本当の目的は、クラス(インスタンス)メソッドのラッピングを行って、(ワークフローのもののために)関数のように見せることです。ただし、出力に追加する必要がありselfます (内容が変更された場合)。

class C(object):
    def f(self): return 'foo','bar'

def wrap(method):
    return lambda self, *args, **kargs: (self,method(self,*args,**kargs))

f = wrap(C.f)
c = C()
f(c)          # returns (c,('foo','bar')) instead of (c,'foo','bar')

私はpython 2.7で作業しているので、このバージョンで解決したいのですが、そうでなければアイデアを放棄します。ただし、python 3のこの問題に関するコメントにはまだ興味があります(そしておそらく将来の読者も)。

4

1 に答える 1