[Python-ideas] dict.setdefault_call(), or API variations thereupon

Alex Shafer ashafer01 at gmail.com
Thu Nov 1 21:06:54 EDT 2018


I'd like to propose an addition to `dict` but I'm not necessarily proposing
what's written here as the API. When I initially saw the need for this
myself, I hastily wrote it as:

def setdefault_call(a_dict, key, default_func):
    try:
        return a_dict[key]
    except KeyError:
        default = default_func()
        a_dict[key] = default
        return default

If its not clear, the purpose is to eliminate the overhead of creating an
empty list or similar in situations like this:

d = {}
for i in range(1000000):  # some large loop
     l = d.setdefault(somekey, [])
     l.append(somevalue)

# instead...

for i in range(1000000):
    l = d.setdefault_call(somekey, list)
    l.append(somevalue)

One potential drawback I see to the concept is that I think there will be a
need to explicitly say "no arguments can get passed into this call".
Otherwise users may defeat the purpose with constructions like this:

d.setdefault_call("foo", list, ["default value"])

I'd mainly like feedback on this concept overall, and if its liked, perhaps
an API discussion to follow. Thanks!

PS

Other APIs I've considered for this are a new keyword argument to the
existing `setdefault()`, or perhaps more radically for Python, a new
keyword argument to the `dict()` constructor that would get called as an
implicit default for `setdefault()` and perhaps used in other scenarios
(essentially defining a type for dict values).
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20181101/46575043/attachment.html>


More information about the Python-ideas mailing list