__author__ = 'RemiZOffAlex' __email__ = 'remizoffalex@mail.ru' class Visitor: def __init__(self, methods: dict = {}): self.__methods = methods def register(self, name, handler): self.__methods[name] = handler def visit(self, node, *args, **kwargs): if 'kind' in node: name = node['kind'] else: raise ValueError('Node is empty') method = self.__methods.get(name, self.__class__.generic_visit) result = method(self, node, *args, **kwargs) return result def generic_visit(self, node, *args, **kwargs): """Called if no explicit visitor function exists for a node.""" method = node['kind'] raise NotImplementedError('No visitor method {method} was defined for this expression: {node}'.format( method=method, node=node )) def __getattr__(self, name): raise AttributeError('Вызван несуществующий метод {name}'.format(name=name)) def __getitem__(self, key): method = self.__methods[key] return method def __iter__(self): return iter(self.__methods) def __len__(self): return len(self.__methods) def __delitem__(self, key): del self.__methods[key] def __repr__(self): return repr(self.__methods)