2012-08-06 3 views
8

functools.partialのドキュメントは、それが「ほぼ同等」であると述べています私はちょうど示された行を変更する必要がありますように。実装functools.partialは

このコードをコピーするだけで心配する必要があるその他の機能/問題点はありますか?

答えて

6

_functoolsmodule.cのソースコードを見ると、心配する必要はありません。

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

ただし、ドキュメントの例では、func,argsおよびkeywordsは純粋に化粧品です。それらは実際のfunctools.partialインスタンスであるためオーバーライドできません。一つの選択肢は、functools.partialをサブクラス化するために、次のようになります。

class rpartial(partial): 
    def __call__(self, *args, **kwargs): 
     kw = self.keywords.copy() 
     kw.update(kwargs) 
     return self.func(*(args + self.args), **kwargs) 
+0

組み込み関数をサブクラス化することは考えていませんでした。 クラスrpartial(部分): – Dave

+0

これは素晴らしいですが、私はそれが読むべきだと思うデフ__call __(自己、* argsを、** kwargsから): キロワット= self.keywords.copy() kw.update(kwargsから) return self.func(*(args + self.args)、** kw) – ishmael

+0

@ishmaelありがとうございました。 – ecatmur

0

一つの落とし穴は、あなたの部分的な割り当ては、次の例のように任意の引数を扱うだろうかです:

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

さて、部分的に、引数1と2にfを適用します。

g = partial(f, 1, 2) 

は何ですかパラメータbの値はgになりますか? 1ですか、それともまだ値を待っていますか?その点については、aの値は何ですか?別の言い方をすれば、もしあれば、与えられた議論のどれだけが追加議論として扱われるべきか。

+0

これは良いコメントですが、私は)( 'グラムを意味するsynataxを宣言したい== F(1,2); g(x)== f(x、1,2); g(x、y)== f(x、y、1,2)などである。これは奇妙なことがありますが、体系的です。 – Dave