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
94
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
import types
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
FLATTEN_TYPES = (tuple, list, types.GeneratorType)
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
def flatten (*items):
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
    """
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
        Flatten common containers/iterables
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
        >>> list(flatten())
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
        []
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
        >>> list(flatten(1, 2, 3))
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
        [1, 2, 3]
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
        >>> list(flatten((1, 2, 3)))
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
        [1, 2, 3]
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
        >>> list(flatten((1, 2), 3))
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
        [1, 2, 3]
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
        >>> list(flatten((1, ), [2], (i for i in [3])))
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
        [1, 2, 3]
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
    """
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
    for item in items:
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
        if item is None:
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
            continue
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
        elif isinstance(item, FLATTEN_TYPES):
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
            for node in item:
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
                yield from flatten(node)
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
        
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
        else:
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
            yield item
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
def merge (*dicts, **kwargs):
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
    """
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
        Merge dicts.
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
        
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
        >>> merge(foo=1, bar=2)
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
        {'foo': 1, 'bar': 2}
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
        >>> merge(dict(foo=1), bar=2)
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
        {'foo': 1, 'bar': 2}
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
        >>> merge(dict(foo=1), bar=2, foo=3)
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
        {'foo': 3, 'bar': 2}
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
        >>> merge(dict(foo=1), dict(bar=2), foo=3)
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
        {'foo': 3, 'bar': 2}
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
        >>> merge(dict(bar=2), dict(foo=1), foo=3)
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
        {'foo': 3, 'bar': 2}
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
        >>> merge(dict(foo=1), dict(foo=2), foo=3)
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        {'foo': 3}
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    """
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
    
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
    # later duplicate keys override
28ae9bc41c63 qmsk.utils: flatten/merge
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
    return {k: v for d in (dicts + (kwargs, )) for k, v in d.items()}