modules/SwissArmyTransformer/sat/model/registry.py (34 lines of code) (raw):

from typing import Any class Registry: def __init__(self, name): self.name = name self.member = {} def register(self, cls): if type(cls) is str: def func(f): self.member[cls] = f return f return func self.member[cls.__name__] = cls return cls def unregister(self, name): self.member.pop(name) def get(self, name): if name not in self.member: raise ValueError(f'model_class {name} not found.') return self.member[name] def __repr__(self): return 'Registry: ' + self.name + " " + str(self.member) model_registry = Registry('sat_models') class MetaModel(type): def __new__(cls, clsname, bases, attrs): newclass = super().__new__(cls, clsname, bases, attrs) model_registry.register(newclass) return newclass def __setattr__(self, __name, __value): if __name == '__name__': model_registry.unregister(getattr(self, __name)) tmp = super().__setattr__(__name, __value) if __name == '__name__': model_registry.register(self) return tmp