@和lambda在Python中意味着什么?

Pat*_*ick -2 python

可能重复:
了解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
Run Code Online (Sandbox Code Playgroud)

在这个中我有一些有趣的结构,我以前从未注意过.谁能告诉我这个@fake东西的交易是什么?

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
Run Code Online (Sandbox Code Playgroud)

此外,这个lambda代表一个函数名称或者是什么处理?

NPE*_*NPE 5

首先,@fake装饰师.

什么@fake似乎做的是有条件替换下面的功能,即split,与lambda函数(注意两个如何采取同样的参数).

该决定基于FUNC_FAKE环境变量.如果后者等于*或包含其split作为其中一个令牌,则进行替换.否则,事实并非如此.

替换是lambda函数的事实并不重要.它可以很容易地成为一个正常的功能:

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):
   ...
Run Code Online (Sandbox Code Playgroud)

整个构造相当令人困惑.我很难想出这样做的理由,除了试图混淆其他程序员(或者与装饰者一起玩).