在Python中@和lambda是什么意思?

可能重复:
了解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

这个中有很多有趣的构造,我从来没有注意过。 有谁能告诉我这个@fake thingy的交易是什么?

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

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


首先, @fake是一个装饰者。

@fake似乎做的是用lambda函数有条件地替换@fake的函数,即split (注意两者如何采用相同的参数)。

该决定基于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):
   ...

这整个构造相当莫名其妙。 我努力想出以这种方式做事的理由,除了试图混淆其他程序员(或与装饰者一起玩)。


第一个问题在别处回答。

对于你的第二个问题:

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

只是一个简写

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

另见这里。

链接地址: http://www.djcxy.com/p/23799.html

上一篇: What do @ and lambda mean in Python?

下一篇: python lines that start with @