<div dir="ltr"><p dir="ltr">But 'shared' and 'local' are both the wrong words to use 
here. Also probably this should syntactically be tied to the function 
header so the time of evaluation is clear(er).</p></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 19, 2016 at 10:37 PM, Nick Coghlan <span dir="ltr"><<a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 20 January 2016 at 10:38, Chris Angelico <<a href="mailto:rosuav@gmail.com">rosuav@gmail.com</a>> wrote:<br>
> Big one for the bike-shedding: Is this "capture as local" (the same<br>
> semantics as the default arg - if you rebind it, it changes for the<br>
> current invocation only), or "capture as static" (the same semantics<br>
> as a closure if you use the 'nonlocal' directive - if you rebind it,<br>
> it stays changed), or "capture as constant" (what people are usually<br>
> going to be doing anyway)?<br>
<br>
</span>The "shared value" approach can already be achieved by binding a<br>
mutable object rather than an immutable one, and there's no runtime<br>
speed difference between looking up a local and looking up a constant,<br>
so I think it makes sense to just stick with "default argument<br>
semantics, but without altering the function signature"<br>
<br>
One possible name for such a directive would be "sharedlocal": it's in<br>
most respects a local variable, but the given definition time<br>
initialisation value is shared across all invocations to the function.<br>
<br>
With that spelling:<br>
<br>
    def f(*, len=len):<br>
         ...<br>
<br>
Would become:<br>
<br>
    def f():<br>
        sharedlocal len=len<br>
        ...<br>
<br>
And you'd also be able to do things like:<br>
<br>
    def f():<br>
        sharedlocal cache={}<br>
<br>
Alternatively, if we just wanted to support early binding of<br>
pre-existing names, then "bindlocal" could work:<br>
<br>
    def f():<br>
        bindlocal len<br>
        ...<br>
<br>
Either approach could be used to handle early binding of loop<br>
iteration variables:<br>
<br>
    for i in range(10):<br>
        def f():<br>
            sharedlocal i=i<br>
            ...<br>
<br>
    for i in range(10):<br>
        def f():<br>
            bindlocal i<br>
            ...<br>
<br>
I'd be -1 on bindlocal (I think dynamic optimisers like PyPy or Numba,<br>
or static ones like Victor's FAT Python project are better answers<br>
there), but "sharedlocal" is more interesting, since it means you can<br>
avoid creating a closure if all you need is to persist a bit of state<br>
between invocations of a function.<br>
<br>
Cheers,<br>
Nick.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Nick Coghlan   |   <a href="mailto:ncoghlan@gmail.com">ncoghlan@gmail.com</a>   |   Brisbane, Australia<br>
</font></span><div class="HOEnZb"><div class="h5">_______________________________________________<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/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/codeofconduct/</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature">--Guido van Rossum (<a href="http://python.org/~guido" target="_blank">python.org/~guido</a>)</div>
</div>