1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """Module containing backported language/library functionality.
23
24 """
25
26 import itertools
27
28 try:
29
30 import functools
31 except ImportError:
32 functools = None
33
34 try:
35
36 import roman
37 except ImportError:
38 roman = None
39
40
41
42
43
44
45
46 try:
47
48
49
50 from hashlib import md5 as md5_hash
51 from hashlib import sha1 as sha1_hash
52
53 sha1 = sha1_hash
54 except ImportError:
55 from md5 import new as md5_hash
56 import sha
57 sha1 = sha
58 sha1_hash = sha.new
59
60
62 """Returns True if all elements in the iterable are True.
63
64 """
65 for _ in itertools.ifilterfalse(bool, seq):
66 return False
67 return True
68
70 """Returns True if any element of the iterable are True.
71
72 """
73 for _ in itertools.ifilter(bool, seq):
74 return True
75 return False
76
77 try:
78
79
80 all = all
81 except NameError:
82 all = _all
83
84 try:
85
86
87 any = any
88 except NameError:
89 any = _any
90
92 """Partition a list in two, based on the given predicate.
93
94 """
95 return (list(itertools.ifilter(pred, seq)),
96 list(itertools.ifilterfalse(pred, seq)))
97
98
99
100
102 """Decorator with partial application of arguments and keywords.
103
104 This function was copied from Python's documentation.
105
106 """
107 def newfunc(*fargs, **fkeywords):
108 newkeywords = keywords.copy()
109 newkeywords.update(fkeywords)
110 return func(*(args + fargs), **newkeywords)
111
112 newfunc.func = func
113 newfunc.args = args
114 newfunc.keywords = keywords
115 return newfunc
116
117
118 if functools is None:
119 partial = _partial
120 else:
121 partial = functools.partial
122
123
125 """Try to convert a value to roman numerals
126
127 If the roman module could be loaded convert the given value to a roman
128 numeral. Gracefully fail back to leaving the value untouched.
129
130 @type val: integer
131 @param val: value to convert
132 @type convert: boolean
133 @param convert: if False, don't try conversion at all
134 @rtype: string or typeof(val)
135 @return: roman numeral for val, or val if conversion didn't succeed
136
137 """
138 if roman is not None and convert:
139 try:
140 return roman.toRoman(val)
141 except roman.RomanError:
142 return val
143 else:
144 return val
145