qmsk/utils.py
author Tero Marttila <terom@paivola.fi>
Thu, 29 Jan 2015 23:11:44 +0200
changeset 107 05707929ff6f
parent 94 28ae9bc41c63
permissions -rw-r--r--
qmsk.web.async: handle HTTPExceptions
import types

FLATTEN_TYPES = (tuple, list, types.GeneratorType)

def flatten (*items):
    """
        Flatten common containers/iterables

        >>> list(flatten())
        []
        >>> list(flatten(1, 2, 3))
        [1, 2, 3]
        >>> list(flatten((1, 2, 3)))
        [1, 2, 3]
        >>> list(flatten((1, 2), 3))
        [1, 2, 3]
        >>> list(flatten((1, ), [2], (i for i in [3])))
        [1, 2, 3]
    """

    for item in items:
        if item is None:
            continue

        elif isinstance(item, FLATTEN_TYPES):
            for node in item:
                yield from flatten(node)
        
        else:
            yield item

def merge (*dicts, **kwargs):
    """
        Merge dicts.
        
        >>> merge(foo=1, bar=2)
        {'foo': 1, 'bar': 2}
        >>> merge(dict(foo=1), bar=2)
        {'foo': 1, 'bar': 2}
        >>> merge(dict(foo=1), bar=2, foo=3)
        {'foo': 3, 'bar': 2}
        >>> merge(dict(foo=1), dict(bar=2), foo=3)
        {'foo': 3, 'bar': 2}
        >>> merge(dict(bar=2), dict(foo=1), foo=3)
        {'foo': 3, 'bar': 2}
        >>> merge(dict(foo=1), dict(foo=2), foo=3)
        {'foo': 3}
    """
    
    # later duplicate keys override
    return {k: v for d in (dicts + (kwargs, )) for k, v in d.items()}