def AllSubclassesOfClass(cls: typing.Type) -> typing.Set[typing.Type]: """Return the set of subclasses of a base class. This recursively returns all nested subclasses of a base class. Example: >>> class A(object): pass >>> class B(A): pass >>> class C(B): pass >>> AllSubclassesOfClass(A) {B, C} Args: cls: The class to return subclasses of. Returns: A set of class types. """ return set(cls.__subclasses__()).union( <<<<<<< HEAD <<<<<<< HEAD:labm8/py/labtypes.py <<<<<<< HEAD <<<<<<< HEAD:labm8/py/labtypes.py <<<<<<< HEAD:labm8/py/labtypes.py ======= >>>>>>> 4242aed2a... Automated code format. ======= >>>>>>> 4242aed2a... Automated code format. [s for c in cls.__subclasses__() for s in AllSubclassesOfClass(c)], )
def find_all_subclasses(cls: tp.Type) -> tp.List[tp.Type]: """ Recursively finds all subclasses of the given class and returns them as a list. :param cls: class to find the subclasses of :return: list of subclasses of the given class """ return cls.__subclasses__() + [ g for s in cls.__subclasses__() for g in find_all_subclasses(s) ]
def spelunk(c: typ.Type): for subclass in c.__subclasses__(): yield from spelunk(subclass) if subclass not in unique_seen: yield subclass unique_seen.add(subclass)
def AllSubclassesOfClass(cls: typing.Type) -> typing.Set[typing.Type]: """Return the set of subclasses of a base class. This recursively returns all nested subclasses of a base class. Example: >>> class A(object): pass >>> class B(A): pass >>> class C(B): pass >>> AllSubclassesOfClass(A) {B, C} Args: cls: The class to return subclasses of. Returns: A set of class types. """ return set(cls.__subclasses__()).union( [s for c in cls.__subclasses__() for s in AllSubclassesOfClass(c)], )
def get_local_subclasses(module, parent_class: typing.Type) -> typing.Sequence: if not hasattr(parent_class, "__subclasses__"): return list() subclasses = [ member for name, member in inspect.getmembers(module) if inspect.isclass(member) and not inspect.isabstract(member) and member in parent_class.__subclasses__() ] return subclasses