如何将自己传递给python字典中的函数

时间:2016-05-08 04:37:30

标签: python google-app-engine dictionary

我正在尝试在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 传递给字典以过滤字典中的某些值,并且分类不是一个选项,因为我的情况是在google-app-engine {{3}中使用它}

所以分类不起作用(因为我无法在数据存储中存储类,所以我使用子类字典而不是上面的其他问题)

2 个答案:

答案 0 :(得分:4)

您的第二次使用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

答案 1 :(得分:2)

使用闭包 - 记住其环境的函数。您无需将任何内容传递到if (menuItem->getTag()) { NativeBridge::rateApp(); UserDefault::getInstance()->setBoolForKey("rate", true); UserDefault::getInstance()->flush(); } } ,所有信息都可以存在:

d["f"]

Rushy是正确的:这是你的问题的文字解决方案,正确使用类可能会使这个问题没有问题(当然是YMMV)。