Project

General

Profile

1
# Useful functions and classes
2

    
3
import locale
4

    
5
locale.setlocale(locale.LC_ALL, '') # needed to initialize locale
6

    
7
#### Function wrappers for statements
8

    
9
def noop(*args, **kw_args): pass
10

    
11
def and_(a, b): return a and b
12

    
13
#### Object metadata
14

    
15
def type_name(value): return type(value).__name__
16

    
17
def module(value): return type(value).__module__.split('.')
18

    
19
def root_module(value): return module(value)[0]
20

    
21
#### Basic types
22

    
23
class ConstraintError(ValueError):
24
    def __init__(self, check_func, value):
25
        ValueError.__init__(self, str(value)+' must satisfy constraint '
26
            +check_func.__name__)
27

    
28
def cast(type_, val):
29
    '''Passes None through'''
30
    if val != None: val = type_(val)
31
    return val
32

    
33
def is_str(val): return isinstance(val, basestring)
34

    
35
#### Strings
36

    
37
def format_str(format, val):
38
    return locale.format_string(format, val, grouping=True)
39

    
40
def to_percent(val, sig_figs=2):
41
    if val >= 1: sig_figs += 1
42
    return format_str('%#.'+str(sig_figs)+'g', val*100)+'%'
43

    
44
def to_si(val, sig_figs=3):
45
    '''Adds SI prefix to value'''
46
    prefix = ''
47
    if val < 1: prefix = 'm'; val *= 1000
48
    return format_str('%#.'+str(sig_figs)+'g', val)+' '+prefix
49

    
50
#### Iterables
51

    
52
def first(iter_): return iter_.next()
53

    
54
def skip(iter_, func):
55
    # Advance iter while func is True
56
    try:
57
        while func(iter_.curr()): iter_.next()
58
    except StopIteration: pass # nothing after the matching elements
59

    
60
def list_subset(list_, idxs):
61
    subset = []
62
    for idx in idxs:
63
        try: subset.append(list_[idx])
64
        except IndexError: pass
65
    return subset
66

    
67
class CheckedIter:
68
    def __init__(self, check_func, iterable):
69
        self.check_func = check_func
70
        self.iter_ = iterable.__iter__()
71
    
72
    def __iter__(self): return self
73
    
74
    def next(self):
75
        entry = self.iter_.next()
76
        if self.check_func(entry): return entry
77
        else: raise ConstraintError(self.check_func, entry)
78

    
79
#### Dicts
80

    
81
def rename_key(dict_, orig, new): dict_[new] = dict_.pop(orig)
82

    
83
def dict_subset(dict_, keys):
84
    subset = dict()
85
    for key in keys:
86
        try: subset[key] = dict_[key]
87
        except KeyError: pass
88
    return subset
(12-12/15)