param icon indicating copy to clipboard operation
param copied to clipboard

concrete_descendents clobbers descendents

Open sdrobert opened this issue 3 years ago • 8 comments

ALL software version info

param v1.12.2, Colab notebook

Description of expected behavior and the observed behavior

Simply put, classes with the same name get clobbered in get_concrete_descendents().

I came across this bug when trying to run some unit tests with duplicated code (and class definitions) were in different files.

Complete, minimal, self-contained example code that reproduces the issue

import sys
import param

from param.parameterized import descendents

print(param.__version__)

class A(object):
  pass

class B(A):
  pass

b = B

print(b in param.concrete_descendents(A).values())

class B(A):
  pass

print(b in param.concrete_descendents(A).values(), b in descendents(A))
print(B in param.concrete_descendents(A).values(), B in descendents(A))
print(issubclass(b, A), issubclass(b, A))

Colab

sdrobert avatar Sep 08 '22 00:09 sdrobert

I can reproduce the problem. And looking at the code, it is easy to see why it happens, as there is no uniqueness to the name of a class. The correct fix would properly be to use the class as key and name as value, though this is a breaking change.

Maybe the best thing is to test if there are duplicate class names in param.concrete_descendents and raise an exception if there are. This could raise exceptions in existing code, but at least it will indicate that something is gone wrong.

https://github.com/holoviz/param/blob/76c7026346b73951dcf4308b6302f0742b0e83e7/param/init.py#L1090-L1101

hoxbro avatar Sep 08 '22 08:09 hoxbro

Hm yes the data structure used should probably not have been a dictionary but a list of tuple/namedtuple?

@philippjfr param.concrete_descendents is used quite a lot in Panel. What change would you be willing to accept, if any, to fix the reported issue?

maximlt avatar Apr 05 '23 10:04 maximlt

Deprecating concrete_descendents with a warning and having a new function with a better data structure could be a solution.

It would allow people to shift to the new function and not break anyone using the current implementation.

hoxbro avatar Apr 05 '23 16:04 hoxbro

Yep that's another valid way to approach that 👍

maximlt avatar Apr 05 '23 16:04 maximlt

It also has another reported issue (https://github.com/holoviz/param/issues/519) which can motivate the creation of another function.

maximlt avatar Apr 05 '23 16:04 maximlt