623 AndSelector(AndSelector(sel1, sel2), AndSelector(sel3, sel4)) |
623 AndSelector(AndSelector(sel1, sel2), AndSelector(sel3, sel4)) |
624 ==> AndSelector(sel1, sel2, sel3, sel4) |
624 ==> AndSelector(sel1, sel2, sel3, sel4) |
625 """ |
625 """ |
626 merged_selectors = [] |
626 merged_selectors = [] |
627 for selector in selectors: |
627 for selector in selectors: |
628 selector = _instantiate_selector(selector) |
628 try: |
629 assert isinstance(selector, Selector), selector |
629 selector = _instantiate_selector(selector) |
|
630 except: |
|
631 pass |
|
632 #assert isinstance(selector, Selector), selector |
630 if isinstance(selector, cls): |
633 if isinstance(selector, cls): |
631 merged_selectors += selector.selectors |
634 merged_selectors += selector.selectors |
632 else: |
635 else: |
633 merged_selectors.append(selector) |
636 merged_selectors.append(selector) |
634 return merged_selectors |
637 return merged_selectors |
660 |
663 |
661 def _instantiate_selector(selector): |
664 def _instantiate_selector(selector): |
662 """ensures `selector` is a `Selector` instance |
665 """ensures `selector` is a `Selector` instance |
663 |
666 |
664 NOTE: This should only be used locally in build___select__() |
667 NOTE: This should only be used locally in build___select__() |
|
668 XXX: then, why not do it ?? |
665 """ |
669 """ |
666 if isinstance(selector, types.FunctionType): |
670 if isinstance(selector, types.FunctionType): |
667 return objectify_selector(selector)() |
671 return objectify_selector(selector)() |
668 if isinstance(selector, type) and issubclass(selector, Selector): |
672 if isinstance(selector, type) and issubclass(selector, Selector): |
669 return selector() |
673 return selector() |