annotate flax/TLUtility.py @ 192:14c67d11027e

EOShow
author dmcc
date Mon, 28 Jul 2003 13:51:08 +0000
parents 45b12307c695
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
1 """Collected utility functions, many are taken from Drew's utils.py in
45b12307c695 Initial revision
drewp
parents:
diff changeset
2 Cuisine CVS and Hiss's Utility.py."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
3
45b12307c695 Initial revision
drewp
parents:
diff changeset
4 from __future__ import generators
45b12307c695 Initial revision
drewp
parents:
diff changeset
5 import sys
45b12307c695 Initial revision
drewp
parents:
diff changeset
6
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 __author__ = "David McClosky <dmcc@bigasterisk.com>, " + \
45b12307c695 Initial revision
drewp
parents:
diff changeset
8 "Drew Perttula <drewp@bigasterisk.com>"
45b12307c695 Initial revision
drewp
parents:
diff changeset
9 __cvsid__ = "$Id: TLUtility.py,v 1.1 2003/05/25 08:25:35 dmcc Exp $"
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 __version__ = "$Revision: 1.1 $"[11:-2]
45b12307c695 Initial revision
drewp
parents:
diff changeset
11
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 def make_attributes_from_args(*argnames):
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
14 This function simulates the effect of running
45b12307c695 Initial revision
drewp
parents:
diff changeset
15 self.foo=foo
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 for each of the given argument names ('foo' in the example just
45b12307c695 Initial revision
drewp
parents:
diff changeset
17 now). Now you can write:
45b12307c695 Initial revision
drewp
parents:
diff changeset
18 def __init__(self,foo,bar,baz):
45b12307c695 Initial revision
drewp
parents:
diff changeset
19 copy_to_attributes('foo','bar','baz')
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 ...
45b12307c695 Initial revision
drewp
parents:
diff changeset
21 instead of:
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 def __init__(self,foo,bar,baz):
45b12307c695 Initial revision
drewp
parents:
diff changeset
23 self.foo=foo
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 self.bar=bar
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 self.baz=baz
45b12307c695 Initial revision
drewp
parents:
diff changeset
26 ...
45b12307c695 Initial revision
drewp
parents:
diff changeset
27 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
28
45b12307c695 Initial revision
drewp
parents:
diff changeset
29 callerlocals=sys._getframe(1).f_locals
45b12307c695 Initial revision
drewp
parents:
diff changeset
30 callerself=callerlocals['self']
45b12307c695 Initial revision
drewp
parents:
diff changeset
31 for a in argnames:
45b12307c695 Initial revision
drewp
parents:
diff changeset
32 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
33 setattr(callerself,a,callerlocals[a])
45b12307c695 Initial revision
drewp
parents:
diff changeset
34 except KeyError:
45b12307c695 Initial revision
drewp
parents:
diff changeset
35 raise KeyError, "Function has no argument '%s'" % a
45b12307c695 Initial revision
drewp
parents:
diff changeset
36
45b12307c695 Initial revision
drewp
parents:
diff changeset
37 def enumerate(*collections):
45b12307c695 Initial revision
drewp
parents:
diff changeset
38 """Generates an indexed series: (0,coll[0]), (1,coll[1]) ...
45b12307c695 Initial revision
drewp
parents:
diff changeset
39
45b12307c695 Initial revision
drewp
parents:
diff changeset
40 this is a multi-list version of the code from the PEP:
45b12307c695 Initial revision
drewp
parents:
diff changeset
41 enumerate(a,b) gives (0,a[0],b[0]), (1,a[1],b[1]) ...
45b12307c695 Initial revision
drewp
parents:
diff changeset
42 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
43 i = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
44 iters = [iter(collection) for collection in collections]
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 while 1:
45b12307c695 Initial revision
drewp
parents:
diff changeset
46 yield [i,] + [iterator.next() for iterator in iters]
45b12307c695 Initial revision
drewp
parents:
diff changeset
47 i += 1
45b12307c695 Initial revision
drewp
parents:
diff changeset
48
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 def dumpobj(o):
45b12307c695 Initial revision
drewp
parents:
diff changeset
50 """Prints all the object's non-callable attributes"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
51 print repr(o)
45b12307c695 Initial revision
drewp
parents:
diff changeset
52 for a in [x for x in dir(o) if not callable(getattr(o, x))]:
45b12307c695 Initial revision
drewp
parents:
diff changeset
53 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
54 print " %20s: %s " % (a, getattr(o, a))
45b12307c695 Initial revision
drewp
parents:
diff changeset
55 except:
45b12307c695 Initial revision
drewp
parents:
diff changeset
56 pass
45b12307c695 Initial revision
drewp
parents:
diff changeset
57 print ""
45b12307c695 Initial revision
drewp
parents:
diff changeset
58
45b12307c695 Initial revision
drewp
parents:
diff changeset
59 def dict_filter_update(d, **newitems):
45b12307c695 Initial revision
drewp
parents:
diff changeset
60 """Adds a set of new keys and values to dictionary 'd' if the values are
45b12307c695 Initial revision
drewp
parents:
diff changeset
61 true:
45b12307c695 Initial revision
drewp
parents:
diff changeset
62
45b12307c695 Initial revision
drewp
parents:
diff changeset
63 >>> some_dict = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 >>> dict_filter_update(some_dict, a=None, b=0, c=1, e={}, s='hello')
45b12307c695 Initial revision
drewp
parents:
diff changeset
65 >>> some_dict
45b12307c695 Initial revision
drewp
parents:
diff changeset
66 {'c': 1, 's': 'hello'}
45b12307c695 Initial revision
drewp
parents:
diff changeset
67 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
68 for k, v in newitems.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
69 if v: d[k] = v
45b12307c695 Initial revision
drewp
parents:
diff changeset
70
45b12307c695 Initial revision
drewp
parents:
diff changeset
71 def try_get_logger(channel):
45b12307c695 Initial revision
drewp
parents:
diff changeset
72 """Tries to get a logger with the channel 'channel'. Will return a
45b12307c695 Initial revision
drewp
parents:
diff changeset
73 silent DummyClass if logging is not available."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
74 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
75 import logging
45b12307c695 Initial revision
drewp
parents:
diff changeset
76 log = logging.getLogger(channel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
77 except ImportError:
45b12307c695 Initial revision
drewp
parents:
diff changeset
78 log = DummyClass()
45b12307c695 Initial revision
drewp
parents:
diff changeset
79 return log
45b12307c695 Initial revision
drewp
parents:
diff changeset
80
45b12307c695 Initial revision
drewp
parents:
diff changeset
81 class DummyClass:
45b12307c695 Initial revision
drewp
parents:
diff changeset
82 """A class that can be instantiated but never used. It is intended to
45b12307c695 Initial revision
drewp
parents:
diff changeset
83 be replaced when information is available.
45b12307c695 Initial revision
drewp
parents:
diff changeset
84
45b12307c695 Initial revision
drewp
parents:
diff changeset
85 Usage:
45b12307c695 Initial revision
drewp
parents:
diff changeset
86 >>> d = DummyClass(1, 2, x="xyzzy")
45b12307c695 Initial revision
drewp
parents:
diff changeset
87 >>> d.someattr
45b12307c695 Initial revision
drewp
parents:
diff changeset
88 Traceback (most recent call last):
45b12307c695 Initial revision
drewp
parents:
diff changeset
89 File "<stdin>", line 1, in ?
45b12307c695 Initial revision
drewp
parents:
diff changeset
90 File "Utility.py", line 33, in __getattr__
45b12307c695 Initial revision
drewp
parents:
diff changeset
91 raise AttributeError, "Attempted usage of a DummyClass: %s" % key
45b12307c695 Initial revision
drewp
parents:
diff changeset
92 AttributeError: Attempted usage of a DummyClass: someattr
45b12307c695 Initial revision
drewp
parents:
diff changeset
93 >>> d.somefunction()
45b12307c695 Initial revision
drewp
parents:
diff changeset
94 Traceback (most recent call last):
45b12307c695 Initial revision
drewp
parents:
diff changeset
95 File "<stdin>", line 1, in ?
45b12307c695 Initial revision
drewp
parents:
diff changeset
96 File "Utility.py", line 33, in __getattr__
45b12307c695 Initial revision
drewp
parents:
diff changeset
97 raise AttributeError, "Attempted usage of a DummyClass: %s" % key
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 AttributeError: Attempted usage of a DummyClass: somefunction"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
99 def __init__(self, use_warnings=1, raise_exceptions=0, **kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
100 """Constructs a DummyClass"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
101 make_attributes_from_args('use_warnings', 'raise_exceptions')
45b12307c695 Initial revision
drewp
parents:
diff changeset
102 def __getattr__(self, key):
45b12307c695 Initial revision
drewp
parents:
diff changeset
103 """Raises an exception to warn the user that a Dummy is not being
45b12307c695 Initial revision
drewp
parents:
diff changeset
104 replaced in time."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
105 if key == "__del__":
45b12307c695 Initial revision
drewp
parents:
diff changeset
106 return
45b12307c695 Initial revision
drewp
parents:
diff changeset
107 msg = "Attempted usage of '%s' on a DummyClass" % key
45b12307c695 Initial revision
drewp
parents:
diff changeset
108 if self.use_warnings:
45b12307c695 Initial revision
drewp
parents:
diff changeset
109 import warnings
45b12307c695 Initial revision
drewp
parents:
diff changeset
110 warnings.warn(msg)
45b12307c695 Initial revision
drewp
parents:
diff changeset
111 if self.raise_exceptions:
45b12307c695 Initial revision
drewp
parents:
diff changeset
112 raise AttributeError, msg
45b12307c695 Initial revision
drewp
parents:
diff changeset
113 return lambda *args, **kw: self.bogus_function()
45b12307c695 Initial revision
drewp
parents:
diff changeset
114 def bogus_function(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
115 pass
45b12307c695 Initial revision
drewp
parents:
diff changeset
116
45b12307c695 Initial revision
drewp
parents:
diff changeset
117 class ClassyDict(dict):
45b12307c695 Initial revision
drewp
parents:
diff changeset
118 """A dict that accepts attribute-style access as well (for keys
45b12307c695 Initial revision
drewp
parents:
diff changeset
119 that are legal names, obviously). I used to call this Struct, but
45b12307c695 Initial revision
drewp
parents:
diff changeset
120 chose the more colorful name to avoid confusion with the struct
45b12307c695 Initial revision
drewp
parents:
diff changeset
121 module."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
122 def __getattr__(self, a):
45b12307c695 Initial revision
drewp
parents:
diff changeset
123 return self[a]
45b12307c695 Initial revision
drewp
parents:
diff changeset
124 def __setattr__(self, a, v):
45b12307c695 Initial revision
drewp
parents:
diff changeset
125 self[a] = v
45b12307c695 Initial revision
drewp
parents:
diff changeset
126 def __delattr__(self, a):
45b12307c695 Initial revision
drewp
parents:
diff changeset
127 del self[a]
45b12307c695 Initial revision
drewp
parents:
diff changeset
128
45b12307c695 Initial revision
drewp
parents:
diff changeset
129 def trace(func):
45b12307c695 Initial revision
drewp
parents:
diff changeset
130 """Good old fashioned Lisp-style tracing. Example usage:
45b12307c695 Initial revision
drewp
parents:
diff changeset
131
45b12307c695 Initial revision
drewp
parents:
diff changeset
132 >>> def f(a, b, c=3):
45b12307c695 Initial revision
drewp
parents:
diff changeset
133 >>> print a, b, c
45b12307c695 Initial revision
drewp
parents:
diff changeset
134 >>> return a + b
45b12307c695 Initial revision
drewp
parents:
diff changeset
135 >>>
45b12307c695 Initial revision
drewp
parents:
diff changeset
136 >>>
45b12307c695 Initial revision
drewp
parents:
diff changeset
137 >>> f = trace(f)
45b12307c695 Initial revision
drewp
parents:
diff changeset
138 >>> f(1, 2)
45b12307c695 Initial revision
drewp
parents:
diff changeset
139 |>> f called args: [1, 2]
45b12307c695 Initial revision
drewp
parents:
diff changeset
140 1 2 3
45b12307c695 Initial revision
drewp
parents:
diff changeset
141 <<| f returned 3
45b12307c695 Initial revision
drewp
parents:
diff changeset
142 3
45b12307c695 Initial revision
drewp
parents:
diff changeset
143
45b12307c695 Initial revision
drewp
parents:
diff changeset
144 TODO: print out default keywords (maybe)
45b12307c695 Initial revision
drewp
parents:
diff changeset
145 indent for recursive call like the lisp version (possible use of
45b12307c695 Initial revision
drewp
parents:
diff changeset
146 generators?)"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
147 name = func.func_name
45b12307c695 Initial revision
drewp
parents:
diff changeset
148 def tracer(*args, **kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
149 s = '|>> %s called' % name
45b12307c695 Initial revision
drewp
parents:
diff changeset
150 if args:
45b12307c695 Initial revision
drewp
parents:
diff changeset
151 s += ' args: %r' % list(args)
45b12307c695 Initial revision
drewp
parents:
diff changeset
152 if kw:
45b12307c695 Initial revision
drewp
parents:
diff changeset
153 s += ' kw: %r' % kw
45b12307c695 Initial revision
drewp
parents:
diff changeset
154 print s
45b12307c695 Initial revision
drewp
parents:
diff changeset
155 ret = func(*args, **kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
156 print '<<| %s returned %s' % (name, ret)
45b12307c695 Initial revision
drewp
parents:
diff changeset
157 return ret
45b12307c695 Initial revision
drewp
parents:
diff changeset
158 return tracer
45b12307c695 Initial revision
drewp
parents:
diff changeset
159
45b12307c695 Initial revision
drewp
parents:
diff changeset
160 # these functions taken from old light8 code
45b12307c695 Initial revision
drewp
parents:
diff changeset
161 def dict_max(*dicts):
45b12307c695 Initial revision
drewp
parents:
diff changeset
162 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
163 ({'a' : 5, 'b' : 9}, {'a' : 10, 'b' : 4})
45b12307c695 Initial revision
drewp
parents:
diff changeset
164 returns ==> {'a' : 10, 'b' : 9}
45b12307c695 Initial revision
drewp
parents:
diff changeset
165 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
166 newdict = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
167 for d in dicts:
45b12307c695 Initial revision
drewp
parents:
diff changeset
168 for k,v in d.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
169 newdict[k] = max(v, newdict.get(k, 0))
45b12307c695 Initial revision
drewp
parents:
diff changeset
170 return newdict
45b12307c695 Initial revision
drewp
parents:
diff changeset
171
45b12307c695 Initial revision
drewp
parents:
diff changeset
172 def dict_scale(d,scl):
45b12307c695 Initial revision
drewp
parents:
diff changeset
173 """scales all values in dict and returns a new dict"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
174 return dict([(k,v*scl) for k,v in d.items()])
45b12307c695 Initial revision
drewp
parents:
diff changeset
175
45b12307c695 Initial revision
drewp
parents:
diff changeset
176 def dict_subset(d, dkeys, default=0):
45b12307c695 Initial revision
drewp
parents:
diff changeset
177 """Subset of dictionary d: only the keys in dkeys. If you plan on omitting
45b12307c695 Initial revision
drewp
parents:
diff changeset
178 keys, make sure you like the default."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
179 newd = {} # dirty variables!
45b12307c695 Initial revision
drewp
parents:
diff changeset
180 for k in dkeys:
45b12307c695 Initial revision
drewp
parents:
diff changeset
181 newd[k] = d.get(k, default)
45b12307c695 Initial revision
drewp
parents:
diff changeset
182 return newd
45b12307c695 Initial revision
drewp
parents:
diff changeset
183
45b12307c695 Initial revision
drewp
parents:
diff changeset
184 # functions specific to Timeline
45b12307c695 Initial revision
drewp
parents:
diff changeset
185 # TBD
45b12307c695 Initial revision
drewp
parents:
diff changeset
186 def last_less_than(array, x):
45b12307c695 Initial revision
drewp
parents:
diff changeset
187 """array must be sorted"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
188 best = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
189 for elt in array:
45b12307c695 Initial revision
drewp
parents:
diff changeset
190 if elt <= x:
45b12307c695 Initial revision
drewp
parents:
diff changeset
191 best = elt
45b12307c695 Initial revision
drewp
parents:
diff changeset
192 elif best is not None:
45b12307c695 Initial revision
drewp
parents:
diff changeset
193 return best
45b12307c695 Initial revision
drewp
parents:
diff changeset
194 return best
45b12307c695 Initial revision
drewp
parents:
diff changeset
195
45b12307c695 Initial revision
drewp
parents:
diff changeset
196 # TBD
45b12307c695 Initial revision
drewp
parents:
diff changeset
197 def first_greater_than(array, x):
45b12307c695 Initial revision
drewp
parents:
diff changeset
198 """array must be sorted"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
199 array_rev = array[:]
45b12307c695 Initial revision
drewp
parents:
diff changeset
200 array_rev.reverse()
45b12307c695 Initial revision
drewp
parents:
diff changeset
201 best = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
202 for elt in array_rev:
45b12307c695 Initial revision
drewp
parents:
diff changeset
203 if elt >= x:
45b12307c695 Initial revision
drewp
parents:
diff changeset
204 best = elt
45b12307c695 Initial revision
drewp
parents:
diff changeset
205 elif best is not None:
45b12307c695 Initial revision
drewp
parents:
diff changeset
206 return best
45b12307c695 Initial revision
drewp
parents:
diff changeset
207 return best
45b12307c695 Initial revision
drewp
parents:
diff changeset
208
45b12307c695 Initial revision
drewp
parents:
diff changeset
209