@和lambda在Python中是什么意思?

@和lambda在Python中是什么意思?,python,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

可能重复:

在尝试将一些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
这其中有一些有趣的结构,我以前从未注意到。有人能告诉我这个“假东西”是怎么回事吗

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代表一个函数名,还是它的作用是什么?

第一个问题得到了回答

关于第二个问题:

x = lambda a, b, *args, **kwargs: <expression>
x=lambda,b,*args,**kwargs:
这只是

def x(a, b, *args, **kwargs):
    return <expression>
def x(a,b,*args,**kwargs):
返回

另请参见。

首先,
@fake
是一个错误

@fake
似乎要做的是有条件地用lambda函数替换后面的函数,即
split
(注意这两个函数是如何使用相同的参数的)

决策基于
FUNC\u FAKE
环境变量。如果后者等于
*
或包含
split
作为其令牌之一,则进行替换。否则就不是了

事实上,替换是一个重要的问题。它也可以很容易地变成一个正常的功能:

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
函数的实现,还包括该行下面的内容。请参阅和上的教程说明。我假设
fake
中的第二行以三个引号结尾?如果没有,则粘贴的内容不完整。这里有两个独立的问题。我想你会发现,每一个都曾经被问过很多次(虽然如果你不知道这个功能叫什么,“装饰者”不是一个明显的搜索词)。@Abhijit这是不可能的。Python装饰器就是这样的:装饰器。它们用与装饰功能兼容的其他功能替换装饰功能。另一方面,注释只是一种可以附加到事物上的元信息。在我还在写的时候,你能不能不要投反对票?!“关于lambda的答案(我正在写)”–为什么不单击“保存”一次(并且只保存一次)您实际上已经写了一些有用的东西?@poke我想在问题结束之前继续提供一些有用的东西。。。已经有4张票数接近。你甚至可以做
@fake
def fake\u split\u替换(…):
。。。然后使用这个“简单装饰”函数作为装饰器本身:
@fake\u split\u replacement
def split(…):
,如果您在多个地方需要它。顺便说一句,我不同意。这个结构似乎对我很有帮助,我看不出有什么问题。。。