2016-04-10 10 views
2

私のアプリケーションで引数が呼び出し可能であるか、または型なしであるという特別な理由はありますか?私はこれがあなたの値としてdefaultdictを使ってdefaultdictをインスタンス化する方法であると確信しています。 defaultdictコンストラクタに提供defaultdictの値を持つdefaultdictを構築する

dict = defaultdict(defaultdict(set)) 

答えて

3

引数は呼び出し可能なゼロ引数(docsを参照)でなければならないので、defaultdict(defaultdict)は、作業を行いますが、defaultdict(defaultdict(set))ません。あなたは少ししかし「カンニング」することができます

d = defaultdict(lambda: defaultdict(set)) 

あなたは順番に、呼び出されたときに、あなたが望む適切なデフォルト値を返すlambda関数の形式で呼び出し可能なゼロ引数を提供する方法。

+0

おかげで、それは多くの意味になります。もし私がこの権利を持っていれば、デフォルト(set)は型の代わりに上記のようにオブジェクトを返します。したがって、外側のdefaultdictのインスタンス化は、代わりにオブジェクトを受け取るため、エラーをスローします。 defaultdict(type(defaultdict(set)) –

+0

これは、タイプを与えるのではなく、内部の辞書をインスタンス化しないため、問題を引き起こします。 –

+0

これは、 'type(defaultdict(set))'はデフォルトの呼び出し可能コードが失われている 'defaultdict'です。 – schwobaseggl

1

defaultdictコンストラクタの機能を提供する必要がありますが、代わりにdefauldict(set)defaultdictオブジェクトです。あなたは、値defaultdictsあなたがラムダを使用することができますdefaultdict構築したい場合:

from collections import defaultdict 

dd = lambda: defaultdict(dd) 
x = dd() 
x['foo']['bar']['foobar'] = 1 
関連する問題