Skip to content

Instantly share code, notes, and snippets.

@jsignell
Created October 3, 2019 14:57
Show Gist options
  • Save jsignell/afd3f4975882787de0b161cac58b2c2e to your computer and use it in GitHub Desktop.
Save jsignell/afd3f4975882787de0b161cac58b2c2e to your computer and use it in GitHub Desktop.
def make_dynamic(func):
from collections import defaultdict
from types import FunctionType
import param
try:
import panel as pn
panel_available = True
except:
panel_available = False
def wrapper(**kwargs):
if not panel_available:
return func(**kwargs)
dynamic = {}
fn_depends = {}
for k, v in kwargs.items():
if isinstance(v, param.Parameter):
dynamic[k] = v
elif isinstance(v, FunctionType) and hasattr(v, '_dinfo'):
fn_depends[k] = v._dinfo['dependencies']
if dynamic or fn_depends:
arg_depends = []
arg_names = []
for k, v in fn_depends.items():
arg_depends += list(v)
for p in v:
arg_names.append(k)
@param.depends(*arg_depends, **dynamic)
def callback(*args, **dyn_kwargs):
combined_kwargs = dict(kwargs, **dyn_kwargs)
fn_args = defaultdict(list)
for name, arg in zip(arg_names, args):
fn_args[(name, kwargs[name])].append(arg)
for (name, fn), args in fn_args.items():
combined_kwargs[name] = fn(*args)
return func(**combined_kwargs)
return pn.panel(callback)
return func(**kwargs)
return wrapper
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment