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(...):,如果你在几个地方都需要它。 顺便说一句,我不同意。这个结构对我来说似乎很有帮助,我在这里没有看到问题......【参考方案2】:

第一个问题回答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)是啥意思?

python里students.sort(key=lambda x: x['name']),两个x的意思是啥?

可以用 lambda 替换 Listener 是啥意思?

python的lambda函数是啥?