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) 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. |