只是尝试将一些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东西的交易是什么?
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是代表函数名称还是代表什么?
答案 0 :(得分:5)
首先,@fake
是decorator。
@fake
似乎做的是用lambda函数有条件地替换后面的函数,即split
(注意两者如何采用相同的参数)。
该决定基于FUNC_FAKE
环境变量。如果后者等于*
或包含split
作为其令牌之一,则进行替换。否则,它不是。
替换为lambda function的事实并不重要。它可以很容易地变成一个正常的函数:
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 :(得分:4)