2016-05-08 13 views
2

私は辞書からいくつかの範囲をminipulatesする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"]()を呼び出すときに私はd["f"](d)を行う場合でも、私は何を取得TypeError: <lambda>() takes exactly 1 argument (0 given).

を入手します!

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

でも可能ですか?そしてどうやって ? ありがとうございます。

UPDATE 1

私は辞書内のいくつかの値をフィルタリングするために辞書に自己を通過したい、と私の場合は、Googleのアプリエンジンでそれを使用することですので、クラス分けはオプションではありませんhere's my question about that

はそうあなたの第2の使用は、

答えて

3

(私が代わりに上記の私の他の質問を参照サブクラスの辞書を使用するので、私は、データストア内のクラスを格納することはできませんので、私はこれを持っている)動作しませんクラス分け、正しいです。

ただし、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クラスを使用して調べることができます。必要なものをはるかに単純な(そしてPythonの)方法で達成することができます。 –

+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

これは非常に便利です。問題は、この質問からのいくつかの問題があるGoogleのアプリエンジンでこれを動作させたいということです。http://stackoverflow.com/questions/36983340/how-to-subclass-google- app-engine-ndb-property-to-support-python-subclassed-obje –

関連する問題