[Python-ideas] dict.setdefault_call(), or API variations thereupon
Chris Barker
chris.barker at noaa.gov
Mon Nov 5 19:11:30 EST 2018
On Fri, Nov 2, 2018 at 7:49 PM, Steven D'Aprano <steve at pearwood.info> wrote:
> Consider the use-case where you want to pass a different default value
> to the dict each time:
>
exactly - the "default" is per call, not the same for the whole dict.
though again, how common is this?
> d.setdefault(key, expensive_function(1, 2, 3))
> d.setdefault(key, expensive_function(4, 8, 16))
> d.setdefault(key, expensive_function(10, 100, 1000))
>
also -- aside from performance, if expensive_function() has side effects,
you may really not want to call it when you don't need to (not that that
would be well-designed code, but...)
and of course, you can always simply do:
if key in d:
val = d[key]
else:
val = expensive_function(4, 8, 16)
d[key] = val
sure, it requires looking up the key twice, but doesn't call the function
unnecessarily.
So it's a pretty small subset of cases, where this would be needed.
defaultdict won't help, because your factory function takes no
> arguments: there's no way to supply arguments for the factory.
>
maybe that's a feature defaultdict should have?
-CHB
> __missing__ won't help, because it only receives the key, not arbitrary
> arguments.
>
> We can of course subclass dict and give it a method with the semantics
> we want:
>
> d.my_setdefault(key, expensive_function, args=(1, 2, 3), kw={})
>
> but it would be nicer and more expressive if we could tell the
> interpreter "don't evaluate expensive_function(...) unless you really
> need it".
>
> Other languages have this -- I believe it is called "Call By Need" or
> "Call By Name", depending on the precise details of how it works. I call
> it delayed evaluation, and Python already has it, but only in certain
> special syntactic forms:
>
> spam and <delayed expression>
> spam or <delayed expression>
> <delayed expression> if condition else <delayed expression>
>
> There are others: e.g. the body of functions, including lambda. But
> functions are kinda heavyweight to make and build and call.
>
>
>
> --
> Steve
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
--
Christopher Barker, Ph.D.
Oceanographer
Emergency Response Division
NOAA/NOS/OR&R (206) 526-6959 voice
7600 Sand Point Way NE (206) 526-6329 fax
Seattle, WA 98115 (206) 526-6317 main reception
Chris.Barker at noaa.gov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20181105/24e50625/attachment.html>
More information about the Python-ideas
mailing list