On Fri, Dec 3, 2021 at 6:24 AM Brendan Barnwell firstname.lastname@example.org wrote:
What I'm saying is that I want that "thing" to exist. At the time the
function is defined, I want there to be a Python object which represents the behavior to be activated at call time if the argument is not passed. In the current proposal there is no such "thing". The function just has behavior melded with its body that does stuff, but there is no addressable "thing" where you can say "if you call the function and the argument isn't passed were are going to take this default-object-whatchamacallit and 'use' it (in some defined way) to get the default value". This is what we already have for early-bound defaults in the function's `__defaults__` attribute.
What would you do with this object? Suppose you have this function:
def f(lst=>, n=>len(lst)): ...
What can you usefully do with this hypothetical object representing the default for n? There is no "thing" and no way you could "use" that thing to predict the value of n without first knowing the full context of the function.
With early-bound defaults, you can meaningfully inspect them and see what the value is going to be. With late-bound defaults, should the default for lst be an empty list? Should the default for n be 0? Neither is truly correct (but they're wrong in different ways).
Do you actually need that object for anything, or is it simply for the sake of arbitrary consistency ("we have objects for early-bound defaults, why can't we have objects for late-bound defaults")?
The value that will be assigned to the parameter does not exist until the function is actually called, and may depend on all kinds of things about the function and its context. Until then, there is no value, no object, that can represent it.
I put to you the same question I put to David Mertz: how is a late-bound default different from half of a conditional expression?
def f(*args): lst = args if len(args) > 0 else  n = args if len(args) > 1 else len(lst) ...
Do the expressions "" and "len(lst)" have to have object representations in this form? If not, why should they need object representations when written in the more natural way as "lst=>"?