Python 中的 @ 和 lambda 是啥意思? [复制]
Posted
技术标签:
【中文标题】Python 中的 @ 和 lambda 是啥意思? [复制]【英文标题】:What do @ and lambda mean in Python? [duplicate]Python 中的 @ 和 lambda 是什么意思? [复制] 【发布时间】:2012-12-01 04:50:54 【问题描述】:可能重复:Understanding Python decorators
只是想将一些 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 装饰器就是这样:装饰器。他们用其他兼容的东西替换装饰的功能。另一方面,注释只是您可以附加到事物上的某种元信息。
【参考方案1】:
首先,@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):
...
这整个结构相当令人费解。我很难想出以这种方式做事的理由,而不是试图迷惑其他程序员(或玩装饰器)。
【讨论】:
你甚至可以做@fake
def fake_split_replacement(...):
...然后使用这个“简单装饰”的函数作为装饰器本身:@fake_split_replacement
def split(...):
,如果你在几个地方都需要它。第一个问题回答elsewhere。
第二个问题:
x = lambda a, b, *args, **kwargs: <expression>
只是简写
def x(a, b, *args, **kwargs):
return <expression>
另见here。
【讨论】:
在我还在写作的时候,你能不能不要投反对票?! “对 lambda 的回答(我正在写)”——你为什么不点击保存一次(而且只点击一次)你真的写了一些有用的东西? @poke 我想在问题结束之前继续提供一些有用的东西......已经有 4 票赞成。以上是关于Python 中的 @ 和 lambda 是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
python里 key=lambda d:d[0]是啥意思?谢谢
lambda x: float(x[1:-1]) 这个函数是啥意思,python 3.5
python中map(lambda x: x % mydict, mylist)是啥意思?