<div dir="ltr"><div class="gmail_extra" style="font-size:12.8px"><div class="gmail_quote"><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">This doesn't make sense.  Function definition time is very different than function execution time.  Changing that distinction is a WAY bigger change than I think we should contemplate.<br>Moreover, there is a completely obvious way to spell the behavior you want:<br><font face="monospace, monospace">def stuff():<br></font><font face="monospace, monospace">    arg = f()<br></font><font face="monospace, monospace">    # ... whatever ...</font><br><span style="font-size:12.8px">This is exactly the obvious way to spell "f() is called every time stuff() is".</span></blockquote><div><br></div><div>I think it would be useful, but yeah, it really doesn't fit in with the rest of lazy/delayed. The present format of defaulting to none and then doing if arg is None: is totally functional.</div><div>On the flip side, doing a lazy in the function definition would save time evaluating defaults while also fitting in.</div><div><br></div><div>Your argument has convinced me, and I now take (what i believe to be) your position:</div><div><br></div><div>def stuff(arg = lazy f()):</div><div><br></div><div>should result in a function where the default value of arg is not evaluated until first function call, and then the value of the expression is used as the default.</div><div><br></div><div>Now, back to  what Michel was probably actually asking.</div><div>In the case of:</div><div><br></div><div>def stuff(arg = lazy []):</div><div>is the default value of arg a new list with each execution? (i.e. the resulting value of the expression is `make a new list`)</div><div><br></div><div>I would say that for consistency's sake, not, which I believe would be consistent with the logic behind why default values being [] are kept between calls.</div><div><br></div><div>a = lazy []</div><div>b = a</div><div>a.append('a')</div><div>print(b) # expected behavior is ['a']</div><div><br></div><div>I maintain that it would be nice for there to be a way to say (the default value of this argument is to run some expression *every time*), but delayed/lazy probably isn't that.</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 19 February 2017 at 13:33, David Mertz <span dir="ltr"><<a href="mailto:mertz@gnosis.cx" target="_blank">mertz@gnosis.cx</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class="">On Sun, Feb 19, 2017 at 10:13 AM, Joseph Hackman <span dir="ltr"><<a href="mailto:josephhackman@gmail.com" target="_blank">josephhackman@gmail.com</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>My honest preference would be that the [] is evaluated fresh each time the function is called.</div><div>def stuff(arg=delayed f()):</div><div>would result in f() being called every time stuff() is. This seems more valuable to me than just doing it once when the function is first called.</div></div></div></div></blockquote><div><br></div></span><div>This doesn't make sense.  Function definition time is very different than function execution time.  Changing that distinction is a WAY bigger change than I think we should contemplate.</div><div><br></div><div>Moreover, there is a completely obvious way to spell the behavior you want:</div><div><br></div></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><font face="monospace, monospace">def stuff():</font></div></div></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><font face="monospace, monospace">    arg = f()</font></div></div></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><font face="monospace, monospace">    # ... whatever ...</font></div></div></div></blockquote><div><br></div>This is exactly the obvious way to spell "f() is called every time stuff() is".<span class=""><br><div class="gmail_extra"><br clear="all"><div><br></div>-- <br><div class="m_2334536763585918736gmail_signature" data-smartmail="gmail_signature">Keeping medicines from the bloodstreams of the sick; food <br>from the bellies of the hungry; books from the hands of the <br>uneducated; technology from the underdeveloped; and putting <br>advocates of freedom in prisons.  Intellectual property is<br>to the 21st century what the slave trade was to the 16th.<br></div>
</div></span></div>
</blockquote></div><br></div>