This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Some uniformness in defaultdict
Type: enhancement Stage:
Components: Library (Lib) Versions: Python 2.6
process
Status: closed Resolution: wont fix
Dependencies: Superseder:
Assigned To: Nosy List: georg.brandl, t-kamiya
Priority: normal Keywords:

Created on 2009-09-03 08:23 by t-kamiya, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
ddh.py t-kamiya, 2009-09-03 08:23 a sample shown in the comment
Messages (2)
msg92193 - (view) Author: Toshihiro Kamiya (t-kamiya) Date: 2009-09-03 08:23
I found the syntax of collections.defaultdict is confusing, at least to 
me.

When I need a defaultdict of int, that is, a defaultdict which contains 
int objects, I can write simply:
a = defaultdict(int)

However, when I want a defaultdict of defaultdict of something, I can't 
write:
d = defaultdict(defaultdict(int))

This raises TypeError.

I understand the argument of defaultdict is not a type (or class), but 
a factory by definition. So I should to write:
d = defaultdict(lambda: defaultdict(int))

But this syntax is somehow confusing to me.
Am I missing some important feature of defaultdict?

The workaround that I've found is:

import collections
class __Helper(object):
  def __getitem__(self, ctor):
    return lambda: collections.defaultdict(lambda: ctor())
genericdefaultdict = __Helper()

This helper introduce some generics flavor in defaultdict.
The above cases can be spelt out:

a = genericdefaultdict[int]()
d = genericdefaultdict[genericdefaultdict[int]]()
msg92204 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2009-09-03 12:19
This won't change -- the argument of defaultdict is simply a callable
that is called with no arguments and returns the default value.

It works with `int` because `int()` can be called without arguments and
yields 0; however, `defaultdict` cannot.  Therefore, the lambda
expression you wrote is one of the correct ways to spell this.
History
Date User Action Args
2022-04-11 14:56:52adminsetgithub: 51079
2009-09-03 12:19:34georg.brandlsetstatus: open -> closed

nosy: + georg.brandl
messages: + msg92204

resolution: wont fix
2009-09-03 08:23:48t-kamiyacreate