functools.partial
ラムダを介して取得できない機能は何ですか?
追加機能に関してはそれほど多くはありません(ただし、後で参照してください)。そして、読みやすさは見る人の目にかかっています。
関数型プログラミング言語 (特に Lisp/Scheme ファミリーの言語) に精通しているほとんどの人は、問題ないように見えlambda
ます – 私は「ほとんど」と言いますが、すべてではありません。 ) しかしlambda
、Python の目障りな異常と考えてください...
彼は、「Python の不具合」の 1 つとして、Python 3 から削除することを計画していたにもかかわらず、Python にそれを受け入れたことを悔い改めました。
私はそれで彼を完全にサポートしました。lambda
(私はSchemeが大好きです... Pythonでは制限があり、奇妙な方法ではそうではありません'残りの言語で、私の肌をクロールさせます)。
しかし、多くの愛好家にとってはそうではありませんでしたlambda
-- Python の歴史の中で最も反乱に近いものの 1 つを上演したのは、Guido が後戻りして撤退することを決定するまででし
た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]
ここで、名前付き引数のオーバーライド可能性と 3 つの属性の設定を 1 つの式に結合し、それがどれほど読みやすいかを教えてください...!