On Mon, May 25, 2020 at 06:22:14PM +0200, Dominik Vilsmeier wrote:

> It wouldn't copy the provided default, it would just reevaluate the
> expression. Python has already a way of deferring evaluation, generator
> expressions:
> 
>     >>> x = 1
>     >>> g = (x for __ in range(2))
>     >>> next(g)
>     1
>     >>> x = 2
>     >>> next(g)
>     2

A function would be a more obvious mechanism. But this won't work to 
solve the mutable default problem. Here's a simulation:

    # we want to delay evaluation for arg=x
    # in this case we have arg=[]
    x = []
    g = lambda: x
    def func():
        arg = g()
        return arg


At first it seems to work:

    py> func()
    []
    py> func()
    []

But we have the same problem with mutable defaults:

    py> L = func()
    py> L.append(1)
    py> func()
    [1]

The problem is that this model just reuses the object referenced in x. 
That's early binding!

Python functions don't use a hidden function or generator `g`, as in 
this simulation, or a global variable `x`. They stash the default value 
inside the function object, in a dunder attribute, and then retrieve it 
when needed.

To get late binding, you need to stash not the *value* of x, in this 
example an empty list `[]`, but some sort of code which will create a 
new empty list each time. A naive implementation might stash the source 
code expression and literally evaluate it:

    x = '[]'
    g = lambda: eval(x)

but there are probably faster ways:

    x = '[]'
    g = eval('lambda: %s' % (x,))

One way or the other, late binding has to re-evaluate the expression for 
the default value. Whether it uses the actual source code, or some 
clever byte-code, it has to recalculate that value each time, not just 
retrieve it from somewhere it was stashed.


-- 
Steven
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/7RNYPBKZROD7CE4WPJFZTNDGSJD247TP/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to