import abc def all_subclasses(cls): return cls.__subclasses__() \ + [g for s in cls.__subclasses__() for g in all_subclasses(s)] class Converter(metaclass=abc.ABCMeta): """ A base class if we incorporate more converters in the future. New implementations need to be registered in this modules __init__.py """ @abc.abstractmethod def convert(self): pass @property @abc.abstractclassmethod def accepted_files(cls): pass @classmethod def implementations(cls): return all_subclasses(cls) @classmethod def accept(cls, filepath): return any(filepath.endswith(ending) for ending in cls.accepted_files)