将lambda内部范围变量的值强制为外部变量 - python

时间:2016-11-28 17:23:34

标签: python lambda

我已经找到了这个问题的各种答案(例如lambda function acessing outside variable)并且都指向同一个hack,即(例如)lambda n=i : n*2 i外部的变量from inspect import getargspec params = ['a','b'] def test(*args): return args[0]*args[1] func = lambda p=params : test(p) lambda的范围(希望我不要滥用术语范围)。然而,这是行不通的,并且鉴于我发现的所有答案通常来自几年前,我认为这可能已被弃用,并且仅适用于旧版本的python。有没有人对如何解决这个问题有任何想法或建议?

抱歉,忘记了MWE

['a','b']

我希望func的签名为func(3,2),但如果我尝试

TypeError: <lambda>() takes at most 1 argument (2 given)

我收到类型错误(getargspec(func)[0]

它的真实签名(来自['p'])是def fit(self, **kwargs): settings = self.synch() freepars = self.loglike.get_args() func = lambda p=freeparams : self.loglike(p) minuit = Minuit(func,**settings)

在我的真实代码中,事情更复杂。不久:

get_params()

我需要lambda,因为根据非硬编码变量列表(通过实例self.loglike提取的func提取,我认为根据非硬编码变量列表创建函数对象的唯一方法})。因此,settings必须具有正确的签名,以匹配dict ['p']

中的信息

检查员将loglike作为func的参数,而不是public function group() { return $this->belongsTo('User'); } 中应该包含的参数列表。希望你能轻易发现我的错误。谢谢

1 个答案:

答案 0 :(得分:0)

没有办法完全按照自己的意愿行事。您尝试用来设置您正在创建的功能的签名的语法并不能满足您的需求。它改为为您定义的参数设置默认值。 Python的函数语法允许您定义一个接受任意数量参数的函数,但它不允许您在变量中定义带有参数名称的函数。

您可以做的是接受*args(或**kwargs),然后对该值进行一些处理以使其与参数名称列表相匹配。这是一个示例,我将特定顺序的位置参数转换为要传递给另一个函数的关键字参数:

arg_names = ['a', 'b']

def foo(*args):
    if len(args) != len(arg_names):
        raise ValueError("wrong number of arguments passed to foo")

    args_by_name = dict(zip(arg_names, args))

    some_other_function(**args_by_name)

这个例子并不是非常有用,但你可以对args_by_name dict进行更复杂的处理(例如将它与另一个dict结合起来),这可能与你的实际用例有关。