2016-05-08 89 views
2

我试图在Python字典中存储一个函数,用于从字典中自我缩小一些范围,但我不知道如何将self传递给函数,例如:如何将自我传递给python字典中的函数

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

我想通过自我的字典词典中过滤一些值,因为我的情况是使用在谷歌应用程序内引擎分级是不是一种选择here's my question about that

所以分级将无法正常工作(我已经得到了这一点,因为我不能存储类在数据存储,所以我使用的子类的字典,而不是看我上面的其他问题)

回答

3

你的第二个用途,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 
+0

这是正确的谢谢你,但我应该通过整个字典的功能,让它的工作?! –

+2

@ user5258689您可能想要使用类进行研究 - 您将能够以更简单(和Pythonic)的方式完成您想要的任务。 –

+0

这是一个好主意,请参阅我的编辑。 –

1

使用闭包 - 即记忆功能的环境。你不需要任何东西进入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)。

+0

这是非常有用的,谢谢你,问题是,我希望这个工作在谷歌应用程序引擎与这个问题从这里的一些问题:http://stackoverflow.com/questions/36983340/how-to-subclass-google-应用程序引擎,NDB属性对支持的Python-子类,OBJE –

相关问题