On Thu, Dec 2, 2021 at 8:40 PM Steven D'Aprano firstname.lastname@example.org wrote:
Depending on the implementation, you *might* be able to inspect the function and see the default expression as some sort of callable function, or evaluatable code object. (That would be nice.)
Unfortunately not, since the default expression could refer to other parameters, or closure variables, or anything else from the context of the called function. So you won't be able to externally evaluate it.
Or even as a plain old string. All of which are first-class objects.
For documentation purposes, it is indeed available as a plain old string. In colloquial terms, it is the source code for the expression, although technically it's reconstructed from the AST. ( This is approximately as accurate as saying that the repr of an object is its source code. Possibly more accurate, actually.)
Or it might be that the default expression will be compiled into the body of the function, where is it effectively invisible. So I guess that's a third change: when, how often, and the difference to introspection.
Among our changes are when, how often, the difference to introspection, and the ability to externally manipulate the defaults. And nice red uniforms.
Although the ability to manipulate them could be considered part of introspection, not sure.
I'm still unsure whether this is a cool feature or an utter abomination:
... try: print("You passed x as", x) ... except UnboundLocalError: print("You didn't pass x") ...
f.__defaults_extra__ = ("n/a",) f(42)
You passed x as 42
You didn't pass x
(It's an implementation detail and not part of the specification, but if CPython adopts this behaviour, it will become de facto part of the expected behaviour, and someone somewhere will use this deliberately.)