Вы только что искали defaultdict.update
?
>>> from collections import defaultdict
>>> thing = defaultdict(int)
>>> thing.update((i, i*i) for i in range(3))
>>> thing
defaultdict(<type 'int'>, {0: 0, 1: 1, 2: 4})
Вы можете поместить это в функцию.
>>> def initdefaultdict(type_, *args, **kwargs):
... d = defaultdict(type_)
... d.update(*args, **kwargs)
... return d
...
>>> thing = initdefaultdict(int, ((i, i+10) for i in range(3)))
>>> thing
defaultdict(<type 'int'>, {0: 10, 1: 11, 2: 12})
>>> thing[3]
0
Или, чтобы удовлетворить ваши первоначальные требования, возвращать функцию:
>>> def defaultdictinitfactory(type_): # this is your "foo"
... def createupdate(*args, **kwargs):
... d = defaultdict(type_)
... d.update(*args, **kwargs)
... return d
... return createupdate
...
>>> f = defaultdictinitfactory(int) # f is your "thing"
>>> d = f((i, i*i) for i in range(3))
>>> d
defaultdict(<type 'int'>, {0: 0, 1: 1, 2: 4})
>>>
Я не понимаю, что вы пытаетесь сделать. Что такое 'thing' и' foo' и почему «вещь» возвращается 0? – jadkik94
Чтобы уточнить: 'thing ((i, i * i) для i в диапазоне (3))' должен возвращать экземпляр 'defaultdict'. Я отредактирую вопрос, чтобы сделать это более ясным – wim
О, хорошо, '-1' заставляло меня думать, что это список, а не отсутствующий индекс. Если бы вы хотели, чтобы «default_factory» сделал это, я не думаю, что это можно было бы сделать, потому что (из документов) «Завод по умолчанию называется *** без аргументов *** для создания нового значения, когда ключ нет, только в __getitem__. " – jadkik94