Skip to content

Commit

Permalink
Group depends for watched deps within a class (#434)
Browse files Browse the repository at this point in the history
  • Loading branch information
ceball authored Sep 22, 2020
1 parent 301b961 commit f68fffc
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions param/parameterized.py
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ def _depends(*args,**kw):
'or function is not supported when referencing '
'parameters by name.')

if not string_specs and watch:
if not string_specs and watch: # string_specs case handled elsewhere (later), in Parameterized.__init__
def cb(*events):
args = (getattr(dep.owner, dep.name) for dep in dependencies)
dep_kwargs = {n: getattr(dep.owner, dep.name) for n, dep in kw.items()}
Expand Down Expand Up @@ -494,7 +494,7 @@ def _params_depended_on(minfo):


def _m_caller(self, n):
def caller(event):
def caller(*events):
return getattr(self,n)()
caller._watcher_name = n
return caller
Expand Down Expand Up @@ -2481,9 +2481,13 @@ def __init__(self, **params):
# instantiation of Parameterized with watched deps. Will
# probably store expanded deps on class - see metaclass
# 'dependers'.
for p in self.param.params_depended_on(n):
grouped = defaultdict(list)
for dep in self.param.params_depended_on(n):
grouped[(id(dep.inst),id(dep.cls),dep.what)].append(dep)
for group in grouped.values():
# TODO: can't remember why not just pass m (rather than _m_caller) here
(p.inst or p.cls).param.watch(_m_caller(self, n), p.name, p.what, queued=queued)
gdep = group[0] # Need to grab representative dep from this group
(gdep.inst or gdep.cls).param.watch(_m_caller(self, n), [d.name for d in group], gdep.what, queued=queued)

self.initialized = True

Expand Down

0 comments on commit f68fffc

Please sign in to comment.