3

次のラッパーのユースケースに出くわします。

def asterisk(fn):
   def retfn(x):
      return fn(*x)
   return retfn

標準の Python 2 ライブラリに既にこれを行っているものはありますか? で調べましたがfunctools、何も見つかりませんでした。

コンテキストとして、最近の使用例を次に示します。

print map(asterisk(operator.sub), [[-20, 20], [-20, 20], [32, 32]])
4

3 に答える 3

6

これを提供するには:

print map(asterisk(operator.sub), [[-20, 20], [-20, 20], [32, 32]])

使用する必要があります

from itertools import starmap
print starmap(operator.sub, [[-20, 20], [-20, 20], [32, 32]])

PS私の知る限り、Pythonにはそのような機能のための組み込み関数はありません。少し前に、Python メーリング リストで、「適用」機能の欠如について話しました。これは、より「一般的な」質問です。operator.apply(f, args)多くの場合、そのようなものが良いと思います。この関数適用の関数表現は、モデルを渡す引数に関する引数を除外することもできます。

于 2012-12-16T18:45:05.267 に答える
1

場合によっては良い解決策ですが、このstarmap場合ははるかに読みやすいと思う別のオプションは、代わりにリスト内包表記を使用することです。

[x - y for x, y in [[-20, 20], [-20, 20], [32, 32]]

operatorモジュールまたはsを使用していることに気付いたらすぐに、リスト内包表記(またはジェネレータ式)を使用することをお勧めしますlambda。これにより、コードがはるかに読みやすくなります(多くの場合、より高速になります)。

于 2012-12-16T19:27:33.047 に答える
1

f呼び出し可能なものについては、次のように書くことができるので、実際には必要ありません。

lambda *args: f(*args)

これはあなたが必要なことをします。構文は、どのライブラリ呼び出しよりも短くなっています。変換自体を具体化する必要がある場合にのみ、それが必要になりますが、それを書くのは書くのと同じくらい簡単です。

def starify(f):
    return lambda *args: f(*args)
于 2012-12-16T20:11:36.733 に答える