2016-05-08 143 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 –

相關問題