如何在python字典中传递self-to函数



我正试图在python字典中存储一个函数,该函数可以从字典本身中最小化一些范围,但我不知道如何将self传递给函数,例如:

d = {"r": range(10), "r2": range(10, 20), "f": lambda self: self["r"].extend(self["r2"])}

我希望它返回扩展列表,如:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

但当我呼叫d["f"]()时,我得到了TypeError: <lambda>() takes exactly 1 argument (0 given).

即使我做d["f"](d),我也一无所获!

>>> d["f"](d)
>>>

那么这可能吗?如何?提前感谢。

更新1

我想将self传递到字典中,以过滤字典中的一些值,并且分类不是一个选项,因为我的情况是在谷歌应用程序引擎中使用它

因此类化将不起作用(我不得不这样做,因为我不能将类存储在数据存储中,所以我使用子类字典,而不是上面的另一个问题)

您的第二个用法d["f"](d)是正确的。

但是,list.extend不会返回任何内容,因此您在终端中看不到任何内容。然而,它正在扩展列表:

>>> x = [1, 2, 3]
>>> x.extend([4, 5]) # nothing is returned here
>>> x
[1, 2, 3, 4, 5]

此外,您应该避免调用函数self的参数——在使用类时,它还有其他用途。


看来您的需求是这种形式的类的完美用例:

class MyData:
    def __init__(self):
        self.r = range(10)
        self.r2 = range(10, 20)
    def f(self):
        self.r.extend(self.r2)
        return self.r

使用它:

d = MyData()
d.f() # prints out your expected result

使用闭包-记住其环境的函数。您不需要向d["f"]传递任何信息,所有信息都可能已经存在:

def make_d():
    d = {"r": range(10), "r2": range(10, 20), "f": lambda: d["r"].extend(d["r2"])}
    return d
the_d = make_d()
the_d["f"]()
the_d
# => {'r': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 'r2': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 'f': <function <lambda> at 0x105c76c80>}

Rushy是正确的:这是一个字面上的问题解决方案,正确使用类可能会使这成为一个非问题(但当然是YMMV)。

最新更新