【发布时间】:2012-12-01 04:50:54
【问题描述】:
只是想将一些 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函数的实现,还包括该行下方的内容。 -
参见Understanding Python decorators 和lambda forms 上的教程说明。
-
我假设
fake的第二行以三个引号结尾?如果不是,则您粘贴的内容不完整。 -
这里有两个不同的问题。我想你会发现每一个都被问过很多次(虽然如果你不知道这个特性叫什么,“装饰器”并不是一个明显的搜索词)。
-
@Abhijit 这是不可能的。 Python 装饰器就是这样:装饰器。他们用其他兼容的东西替换装饰的功能。另一方面,注释只是您可以附加到事物上的某种元信息。
标签: python