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是否代表一个函数名,或者如何处理?
首先,
该决定基于
替换为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> |
这里也可以看到。