<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Nov 2, 2018 at 7:49 PM, Steven D'Aprano <span dir="ltr"><<a href="mailto:steve@pearwood.info" target="_blank">steve@pearwood.info</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Consider the use-case where you want to pass a different default value <br>
to the dict each time:<br></blockquote><div><br></div><div>exactly - the "default" is per call, not the same for the whole dict. though again, how common is this?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
    d.setdefault(key, expensive_function(1, 2, 3))<br>
    d.setdefault(key, expensive_function(4, 8, 16))<br>
    d.setdefault(key, expensive_function(10, 100, 1000))<br></blockquote><div><br></div><div>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...)</div><div><br></div><div>and of course, you can always simply do:</div><div><br></div><div>if key in d:</div><div><div style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">    val = d[key]</div>else:<br class="gmail-Apple-interchange-newline">    val = <span style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">expensive_function(4, 8, 16)</span></div><div>    d[key] = val</div><div><br></div><div>sure, it requires looking up the key twice, but doesn't call the function unnecessarily.</div><div><br></div><div>So it's a pretty small subset of cases, where this would be needed.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">defaultdict won't help, because your factory function takes no <br>
arguments: there's no way to supply arguments for the factory.<br></blockquote><div><br></div><div>maybe that's a feature defaultdict should have?</div><div><br></div><div>-CHB</div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
__missing__ won't help, because it only receives the key, not arbitrary <br>
arguments.<br>
<br>
We can of course subclass dict and give it a method with the semantics <br>
we want:<br>
<br>
    d.my_setdefault(key, expensive_function, args=(1, 2, 3), kw={})<br>
<br>
but it would be nicer and more expressive if we could tell the <br>
interpreter "don't evaluate expensive_function(...) unless you really <br>
need it".<br>
<br>
Other languages have this -- I believe it is called "Call By Need" or <br>
"Call By Name", depending on the precise details of how it works. I call <br>
it delayed evaluation, and Python already has it, but only in certain <br>
special syntactic forms:<br>
<br>
    spam and <delayed expression><br>
    spam or <delayed expression><br>
    <delayed expression> if condition else <delayed expression><br>
<br>
There are others: e.g. the body of functions, including lambda. But <br>
functions are kinda heavyweight to make and build and call.<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
<br>
-- <br>
Steve<br>
</font></span><div class="HOEnZb"><div class="h5">______________________________<wbr>_________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/<wbr>codeofconduct/</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><br>Christopher Barker, Ph.D.<br>Oceanographer<br><br>Emergency Response Division<br>NOAA/NOS/OR&R            (206) 526-6959   voice<br>7600 Sand Point Way NE   (206) 526-6329   fax<br>Seattle, WA  98115       (206) 526-6317   main reception<br><br><a href="mailto:Chris.Barker@noaa.gov" target="_blank">Chris.Barker@noaa.gov</a></div>
</div></div>