class Section(object): def __init__(self, name, params=None): self._name = name if params is None: self._params = OrderedDict() else: self._params = params self._sub_sections = OrderedDict() def __getitem__(self, index): return self.get_subsections_by_name(index) def __repr__(self): return 'Section %s (%s)' % (self.get_name(), self._params or '') def set_params(self, **params): self._params = params def get_params(self): return self._params def get_name(self): return self._name def add_sub_section(self, sec): key = sec.get_name() if key not in self._sub_sections: self._sub_sections[key] = [] self._sub_sections[key].append(sec) return sec def get_subsections_by_name(self, name): return self._sub_sections.get(name, []) def get_subsections_by_param_val(self, **kwargs): ret = [] for item in self.get_subsections(): item_match = True for k, v in kwargs.iteritems(): item_params = item.get_params() if k in item_params.keys(): if item_params[k] != v: item_match = False if item_match: ret.append(item) return ret def get_subsections(self): for subsec in self._sub_sections.itervalues(): for sub in subsec: yield sub def search_section_childs(self, section_name, param_name): return self._search_section_params(self, section_name, param_name) def _search_section_params(self, section, section_name, param_name): param_values = set() for s in section.get_subsections(): if s.get_name() == section_name: for key, val in s.get_params().iteritems(): if key == param_name: param_values.add(val) deeper_values = self._search_section_params(s, section_name, param_name) param_values |= deeper_values return param_values # Generator for subsections def __iter__(self): return self.get_subsections()