
Yes, I want that when Void is received in a function parameter it is not
Михаил Крупенков: processed:
func(Void) == func() == "default"
Mathew Elman:
I believe this is a rebirth of a request that has come up many times before, which is to have something like javascript's `undefined` where it means "use the default value" if passed to a function that has a default value or "value not provided" (slightly different to "None").
I think this can be achieved with a decorator.
import inspect, functools
class Void: ... pass ... def handle_defaults(f, undefined=Void): ... sig = inspect.signature(f) ... @functools.wraps(f) ... def defaults_handled(*args, **kwargs): ... bound = sig.bind(*args, **kwargs) ... bound.apply_defaults() ... for name, value in list(bound.arguments.items()): ... if value is undefined: ... field = sig.parameters[name] ... if field.default is not inspect._empty: ... bound.arguments[name] = field.default ... return f(*bound.args, **bound.kwargs) ... return defaults_handled ...
@handle_defaults ... def func(val="default"): ... return val ... func(Void) 'default'
def wrapper(val=Void): ... return func(val) ...
wrapper() 'default'
(In case formatting is screwed up in the above example, see https://gist.github.com/lucaswiman/995f18763d088555547a74864254ac0b) I would recommend using Ellipsis (...) rather than Void for this purpose so you have a convenient syntax. Best wishes, Lucas