可能重复:
了解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代表一个函数名称或者是什么处理?
首先,@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)
整个构造相当令人困惑.我很难想出这样做的理由,除了试图混淆其他程序员(或者与装饰者一起玩).
| 归档时间: |
|
| 查看次数: |
604 次 |
| 最近记录: |