functools.partial
ラムダを通過できない機能は何ですか?
余分な機能に関してはそれほどではありませんが(ただし、後で参照)、読みやすさは見る人の目にあります。
関数型プログラミング言語(特にLisp / Schemeファミリの言語)に精通しているほとんどの人は問題ないと思われlambda
ます。「ほとんど」と言いますが、すべてではありません。)しかしlambda
、Pythonの目障りな異常と考えてください...
彼はこれをPythonに受け入れたことを悔い改め、「Pythonの不具合」の1つとしてPython 3から削除する予定でした。
その中で私は彼を完全にサポートしました。(私は大好きlambda
スキームで ...しばらくその限界をPythonで、そして奇妙な方法、それはちょうどdoesnの 言語の残りの部分で、私の皮膚をクロールさせます)。
それほど、しかし、の大群のためのlambda
愛好家-グイドは撤回して残すことを決めたまでは、これまでPythonの歴史の中で見反乱に最も近いものの一つを上演lambda
。中に
いくつかの可能な添加物にfunctools
(定数を返す関数を作成するには、アイデンティティ、など)は発生しませんでした(より多くlambda
のの機能が明示的に複製されることを回避するため)、partial
もちろん残りました(完全な複製ではなく、目障りでもありません)。
ことを忘れないでくださいlambda
の体がに制限される表現、それは限界を持っているので、。例えば...:
>>> import functools
>>> f = functools.partial(int, base=2)
>>> f.args
()
>>> f.func
<type 'int'>
>>> f.keywords
{'base': 2}
>>>
functools.partial
の返される関数は、イントロスペクションに役立つ属性、つまり、ラップしている関数、およびその中で修正する位置引数と名前付き引数で装飾されています。さらに、名前付き引数はすぐに上書きできます(「修正」は、ある意味では、デフォルトの設定です)。
>>> f('23', base=10)
23
ご覧のとおり、それは明らかにlambda s: int(s, base=2)
!-)ほど単純ではありません。
はい、ラムダをゆがめてこれをいくつか与えることができます。たとえば、キーワードの上書きの場合、
>>> f = lambda s, **k: int(s, **dict({'base': 2}, **k))
しかし、私は最も熱心な- 恋人でもこの恐怖を電話よりも読みやすいとは思わないことを心から望んでいます!-)。「属性の設定」の部分は、Pythonの「ボディは単一の式」の制限があるため(さらに、割り当てをPython式の一部にできないため)、結局は「式内の割り当てを偽る」ことになります。リストの理解をその設計の限界をはるかに超えて伸ばすことによって...:lambda
partial
lambda
>>> f = [f for f in (lambda f: int(s, base=2),)
if setattr(f, 'keywords', {'base': 2}) is None][0]
今、単一の式に、名前付き引数overridability、プラス3つの属性の設定を組み合わせて、そしてどれだけ読める教えてそれがあることを行っています...!
functools.partial
あなたが言及した追加の機能性がラムダより優れていると思います。おそらくこれは別の投稿のトピックですが、設計レベルであなたがそれほど気になるのはlambda
何ですか?