-2

重複の可能性:
Pythonデコレータを理解する

いくつかのPythonコードをJavaに「移植」しようとしたところ、次のPythonコードに出くわしました。

 @fake(lambda s, t, n: [(s.field(i+1), s) for i in range(n)])
 def split(secret, threshold, num_players):
     shares = []
     for i in range(1, num_players+1):
         # do some shares calculation
     return shares

これには、これまで気づかなかった興味深い構成がかなりあります。誰かがこの@fakethingyとの取引は何ですか?

def fake(replacement):
    """Replace a function with a fake version."""
    def decorator(func):
        fakes = os.environ.get('FUNC_FAKE', '')
        if fakes == '*' or func.__name__ in fakes.split():
            return replacement
        else:
            return func
    return decorator

さらに、このラムダは関数名を表しますか、それともそれとの関係は何ですか?

4

2 に答える 2

5

まず@fakeデコレータです。

@fake次の関数、つまりsplitラムダ関数を条件付きで置き換えるように見えます(2つが同じパラメーターを受け取る方法に注意してください)。

FUNC_FAKE決定は環境変数に基づいています。後者がトークンの1つと等しい*か含まれている場合、置換が行われます。splitそうでなければ、そうではありません。

置換がラムダ関数であるという事実は重要ではありません。それは同じように簡単に通常の機能にすることができたでしょう:

def split_replacement(s, t, n):
   return [(s.field(i+1), s) for i in range(n)])

@fake(split_replacement)
def split(s, t, n):
   ...

この全体の構成はかなり不可解です。他のプログラマーを混乱させる(またはデコレーターで遊ぶ)以外に、この方法で物事を行う理由を考え出すのに苦労しています。

于 2012-12-13T10:27:37.817 に答える
4

最初の質問はの場所で回答されます。

2番目の質問:

x = lambda a, b, *args, **kwargs: <expression>

の省略形です

def x(a, b, *args, **kwargs):
    return <expression>

こちらもご覧ください

于 2012-12-13T10:27:28.887 に答える