def test_iterable(self): """iterable(x) should return x or [x], always an iterable result""" self.assertEqual(iterable("x"), "x") self.assertEqual(iterable(""), "") self.assertEqual(iterable(3), [3]) self.assertEqual(iterable(None), [None]) self.assertEqual(iterable({"a": 1}), {"a": 1}) self.assertEqual(iterable(["a", "b", "c"]), ["a", "b", "c"])
def complement(self, item): """Returns complement of item, using data from self.complements. Always tries to return same type as item: if item looks like a dict, will return list of keys. """ if not self.complements: raise TypeError( "Tried to complement sequence using alphabet without complements." ) try: return item.translate(self.ComplementTable) except (AttributeError, TypeError): item = iterable(item) get = self.complements.get return item.__class__([get(i, i) for i in item])
def __init__(self, spans=None): """Returns a new Range object with data in spans.""" spans = [] if spans is None else spans result = SpansOnly() # need to check if we got a single Span, since they define __iter__. if isinstance(spans, Span): result.append(spans) elif hasattr(spans, "spans"): # probably a single range object? result.extend(spans.spans) else: for s in iterable(spans): if hasattr(s, "spans"): result.extend(s.spans) else: result.append(s) self.spans = result
def list_extender(obj, field, val): """Adds val to list in obj.field, creating list if necessary.""" try: getattr(obj, field).extend(iterable(val)) except AttributeError: setattr(obj, field, list(val))