9

functools.partialのドキュメントには、「ほぼ同等」と記載されています。

def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*(args + fargs), **newkeywords)  # line to change
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

追加の引数を付加するバージョンを実装したい場合は、示された行を変更するだけでよいようです。

このコードをコピーするだけで心配すべき他の機能/落とし穴はありますか?

4

2 に答える 2

8

のソースコードを見ると、_functoolsmodule.c心配することはあまりないと思います。

のモジュール実装はピクルスとをpartial処理しますが、他のすべてはドキュメントのように機能するように見えるので、おそらくCで実装される理由は効率のためだけです。単なる関数クロージャではなく、型であるという事実もあります。repr

ただし、ドキュメントの例funcでは、、、argsおよびkeywordsは純粋に表面的なものであることに注意してください。functools.partialつまり、実際のインスタンスの場合のようにオーバーライドできません。1つの代替手段は、サブクラス化することfunctools.partialです。

class rpartial(partial):
    def __call__(self, *args, **kwargs):
        kw = self.keywords.copy()
        kw.update(kwargs)
        return self.func(*(args + self.args), **kw)
于 2012-08-06T15:50:51.770 に答える
0

落とし穴の1つは、次の例のように、部分的な割り当てが任意の引数を処理する方法です。

def f(a,b, *args):
    pass

fここで、引数1と2に部分的に適用します。

g = partial(f, 1, 2)

のパラメータの値は何bですかg?それは1ですか、それともまだ値を待っていますか?そのことについては、の値はa何ですか?別の言い方をすれば、提供された引数があれば、いくつを追加の引数として扱う必要があります。

于 2012-08-06T15:41:26.267 に答える