2013-07-30 34 views
13

Vì vậy, defaultdict documentation đề cập rằng, nếu một mục bị thiếu, giá trị trả về bởi default_factory "được chèn vào từ điển cho khóa và trả về." Đó là thời gian tuyệt vời nhất, nhưng những gì tôi thực sự muốn trong trường hợp này là cho giá trị được trả lại nhưng không phải được chèn vào defaultdict.Default defaultdict không chèn các giá trị bị thiếu

Tôi đã tìm tôi có thể phân lớp defaultdict và ghi đè ... Tôi đoán __missing__? Không chắc. Cách tốt nhất để giải quyết vấn đề này là gì?

Xin cảm ơn trước.

Trả lời

13

Bạn có thể phân lớp dict và thực hiện __missing__:

class missingdict(dict): 
    def __missing__(self, key): 
     return 'default' # note, does *not* set self[key] 

Demo:

>>> d = missingdict() 
>>> d['foo'] 
'default' 
>>> d 
{} 

Bạn thể lớp con defaultdict quá, bạn sẽ nhận được các nhà máy xử lý cộng với bản sao và dưa hỗ trợ ném vào :

from collections import defaultdict 

class missingdict(defaultdict): 
    def __missing__(self, key): 
     return self.default_factory() 

Demo:

>>> from collections import defaultdict 
>>> class missingdict(defaultdict): 
...  def __missing__(self, key): 
...   return self.default_factory() 
... 
>>> d = missingdict(list) 
>>> d['foo'] 
[] 
>>> d 
defaultdict(<type 'list'>, {}) 

nhưng, như bạn có thể thấy, __repr__ không nói dối về tên của nó.

+0

Điều đó thật hoàn hảo. Tôi có thể sẽ đi với các tuyến đường defaultdict để có được sự hỗ trợ sao chép. Cảm ơn! – Chad

+0

Tôi có thể đặt giá trị mặc định cho 'd.pop (" unloaded_key ")' không? – lerner

+1

@Lerner: 'dict.pop()' lấy đối số thứ hai cho mặc định. 'dict.pop()' sẽ * không * tham khảo '__missing__', cũng như hầu hết các phương thức khác; chỉ 'dict .__ getitem__' hiện (do đó' d [missingkey] '). –

Các vấn đề liên quan