Python Forum
def function default parameter expressions - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: def function default parameter expressions (/thread-20611.html)



def function default parameter expressions - Skaperen - Aug-22-2019

when there is an assignment of a default to an expression in a function def prototype at function definition time, can the expression use previously defined defparameters?


RE: def function default parameter expressions - scidam - Aug-22-2019

I have no Python 3.8 installed now, maybe walrus operator (:=) allows this?! Not sure. However, you can build your own solution, using inspect module e.g. something like this:

import inspect
from functools import wraps

class Placeholder:
    __slots__ = ('expr', )
    def __init__(self, expr):
        self.expr=expr
        
def use_var_expr(expr):
    return Placeholder(expr)

def allow_inline_assignment(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        env = {k: v.default for k, v in inspect.signature(f).parameters.items() if not isinstance(v.default, Placeholder)}
        new_kwargs = dict()
        for k, v in inspect.signature(f).parameters.items():
            if v.default is not inspect._empty:
                if isinstance(v.default, Placeholder):
                    exec('result = ' + v.default.expr, env)
                    new_kwargs.update({k: env.get('result')})
                else:
                    new_kwargs.update({k: v.default})
        return f(*args, **new_kwargs)
    return wrapper

@allow_inline_assignment
def a(z, x=4, p=use_var_expr('x * x**2')):
    print("Positional arg: ", z)
    print("First keyword value: ", x)
    print("Second keyword value: ", p)
a(3)
Output:
Positional arg: 3 First keyword value: 4 Second keyword value: 64
Note: this solution is just for fun; it uses exec and, therefore, maybe unsafe.


RE: def function default parameter expressions - Skaperen - Aug-22-2019

the whole point was to make simpler code and not have to duplicate prototype expression on the def statement. all that code isn't achieving that.