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

What do @ and lambda mean in Python?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Understanding Python decorators

我只是想把一些Python代码移植到Java,然后我就遇到了下面的Python代码:

1
2
3
4
5
6
 @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

这本书中有很多有趣的结构,我以前从未注意过。有人能告诉我这个"假东西"是怎么回事吗?

1
2
3
4
5
6
7
8
9
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函数替换后面的函数,即split(注意这两个函数如何采用相同的参数)。

该决定基于FUNC_FAKE环境变量。如果后者等于*或包含split作为其令牌之一,则进行替换。否则,就不是了。

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

1
2
3
4
5
6
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):
   ...

整个建筑相当令人困惑。我努力想出一个这样做的理由,而不是试图混淆其他程序员(或与装饰师一起玩)。


第一个问题在别处回答。

第二个问题:

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

只是一个缩写

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

这里也可以看到。