2017-04-07 50 views
0

the docs所有給出的例子似乎是情況:其中在defaultdict第一調用參數是一個「常數」功能,如intlist,或lambda: const等。我不知道是否defaultdict只是應該採取恆定功能作爲它的callabe參數,但如果不是,我希望callable依賴於我給出的缺少的鍵值。例如可以使用defaultdict接受取決於給定缺失鍵的可調用嗎?

toy = collections.defaultdict(lambda x: len(x), {'foo': 3}) 
toy['barr'] 

我期望是,每當我給一個丟失密鑰字符串,例如'barr',該容器可以創建'barr'是關鍵和它的長度4爲價值的新條目。但它不起作用。取而代之的是,它給了我下面的錯誤:

TypeError: <lambda>() missing 1 required positional argument: 'x' 

我預計'barr'是這個lambda的說法在這裏,但它顯然並非如此。那麼會出現什麼問題呢?

+1

'defaultdict'是爲默認值設計的,也就是說不依賴於它們的鍵的值。你最好使用一個常規的'dict'並自己動手 –

回答

2

默認工廠從來沒有給出任何參數,所以你不能這樣做。你能做什麼,不過,是子類defaultdict並定義__missing__方法:

class CustomDefaultDict(collections.defaultdict): 
    def __missing__(self, key): 
     self[key] = value = len(key) 
     return value 

爲了使它更易於延展,你也可以採取default_factory的優勢,但給它的鍵作爲參數:

class CustomDefaultDict(collections.defaultdict): 
    def __missing__(self, key): 
     if self.default_factory is None: 
      raise KeyError((key,)) 
     self[key] = value = self.default_factory(key) 
     return value 
1

從文檔:


如果default_factory不是沒有,它被稱爲沒有申辯提供爲給定鍵提供默認值,該值插入字典中的鍵並返回。


defaultdict根本無法按照您嘗試使用它的方式工作。

+0

謝謝我認爲我現在明白了:基本上'defaultdict'實際上只是應該把持續的函數當作可調用的參數。這有點奇怪:爲什麼使用常量*函數*而不僅僅是常量本身? – Vim

+0

因爲這是更典型的用例。 –

+0

要明確:目的是爲了defaultdict像一個有指定的'setdefault'參數的常規字典。 'setdefault'方法只接受一個不接受參數的函數。 –

相關問題