Home | Trees | Indices | Help |
|
---|
|
1 # epydoc -- Backwards compatibility 2 # 3 # Copyright (C) 2005 Edward Loper 4 # Author: Edward Loper <edloper@loper.org> 5 # URL: <http://epydoc.sf.net> 6 # 7 # $Id: util.py 956 2006-03-10 01:30:51Z edloper $ 8 9 """ 10 Backwards compatibility with previous versions of Python. 11 12 This module provides backwards compatibility by defining several 13 functions and classes that were not available in earlier versions of 14 Python. Intented usage: 15 16 >>> from epydoc.compat import * 17 18 Currently, epydoc requires Python 2.3+. 19 """ 20 __docformat__ = 'epytext' 21 22 ###################################################################### 23 #{ New in Python 2.4 24 ###################################################################### 25 26 # set 27 try: 28 set 29 except NameError: 30 try: 31 from sets import Set as set, ImmutableSet as frozenset 32 except ImportError: 33 pass # use fallback, in the next section. 34 35 # sorted 36 try: 37 sorted 38 except NameError:40 if key is None: 41 elts = list(iterable) 42 else: 43 elts = [(key(v), v) for v in iterable] 44 45 if reverse: elts.reverse() # stable sort. 46 if cmp is None: elts.sort() 47 else: elts.sort(cmp) 48 if reverse: elts.reverse() 49 50 if key is None: 51 return elts 52 else: 53 return [v for (k,v) in elts]54 55 # reversed 56 try: 57 reversed 58 except NameError: 63 64 ###################################################################### 65 #{ New in Python 2.3 66 ###################################################################### 67 # Below is my initial attempt at backporting enough code that 68 # epydoc 3 would run under python 2.2. However, I'm starting 69 # to think that it's not worth the trouble. At the very least, 70 # epydoc's current unicode handling still doesn't work under 71 # 2.2 (after the backports below), since the 'xmlcharrefreplace' 72 # error handler was introduced in python 2.3. 73 74 # # basestring 75 # try: 76 # basestring 77 # except NameError: 78 # basestring = (str, unicode) 79 80 # # sum 81 # try: 82 # sum 83 # except NameError: 84 # def _add(a,b): return a+b 85 # def sum(vals): return reduce(_add, vals, 0) 86 87 # # True & False 88 # try: 89 # True 90 # except NameError: 91 # True = 1 92 # False = 0 93 94 # # enumerate 95 # try: 96 # enumerate 97 # except NameError: 98 # def enumerate(iterable): 99 # lst = list(iterable) 100 # return zip(range(len(lst)), lst) 101 102 # # set 103 # try: 104 # set 105 # except NameError: 106 # class set(dict): 107 # def __init__(self, elts=()): 108 # dict.__init__(self, [(e,1) for e in elts]) 109 # def __repr__(self): 110 # return 'set(%r)' % list(self) 111 # def add(self, key): self[key] = 1 112 # def copy(self): 113 # return set(dict.copy(self)) 114 # def difference(self, other): 115 # return set([v for v in self if v not in other]) 116 # def difference_udpate(self, other): 117 # newval = self.difference(other) 118 # self.clear(); self.update(newval) 119 # def discard(self, elt): 120 # try: del self[elt] 121 # except: pass 122 # def intersection(self, other): 123 # return self.copy().update(other) 124 # def intersection_update(self, other): 125 # newval = self.intersection(other) 126 # self.clear(); self.update(newval) 127 # def issubset(self, other): 128 # for elt in self: 129 # if elt not in other: return False 130 # return True 131 # def issuperset(self, other): 132 # for elt in other: 133 # if elt not in self: return False 134 # return True 135 # def pop(self): self.popitem()[0] 136 # def remove(self, elt): del self[elt] 137 # def symmetric_difference(self, other): 138 # return set([v for v in list(self)+list(other) 139 # if (v in self)^(v in other)]) 140 # def symmatric_difference_update(self, other): 141 # newval = self.symmetric_difference(other) 142 # self.clear(); self.update(newval) 143 # def union(self, other): 144 # return set([v for v in list(self)+list(other) 145 # if (v in self) or (v in other)]) 146 # def union_update(self, other): 147 # newval = self.union(other) 148 # self.clear(); self.update(newval) 149 # def update(self, other): 150 # dict.update(self, set(other)) 151 152 # # optparse module 153 # try: 154 # import optparse 155 # except ImportError: 156 # import new, sys, getopt 157 # class _OptionVals: 158 # def __init__(self, vals): self.__dict__.update(vals) 159 # class OptionParser: 160 # def __init__(self, usage=None, version=None): 161 # self.usage = usage 162 # self.version = version 163 # self.shortops = ['h'] 164 # self.longops = [] 165 # self.option_specs = {} 166 # self.defaults = {} 167 # def fail(self, message, exitval=1): 168 # print >>sys.stderr, message 169 # system.exit(exitval) 170 # def add_option_group(self, group): pass 171 # def set_defaults(self, **defaults): 172 # self.defaults = defaults.copy() 173 # def parse_args(self): 174 # try: 175 # (opts, names) = getopt.getopt(sys.argv[1:], 176 # ''.join(self.shortops), 177 # self.longops) 178 # except getopt.GetoptError, e: 179 # self.fail(e) 180 181 # options = self.defaults.copy() 182 # for (opt,val) in opts: 183 # if opt == '-h': 184 # self.fail('No help available') 185 # if opt not in self.option_specs: 186 # self.fail('Unknown option %s' % opt) 187 # (action, dest, const) = self.option_specs[opt] 188 # if action == 'store': 189 # options[dest] = val 190 # elif action == 'store_const': 191 # options[dest] = const 192 # elif action == 'count': 193 # options[dest] = options.get(dest,0)+1 194 # elif action == 'append': 195 # options.setdefault(dest, []).append(val) 196 # else: 197 # self.fail('unsupported action: %s' % action) 198 # for (action,dest,const) in self.option_specs.values(): 199 # if dest not in options: 200 # if action == 'count': options[dest] = 0 201 # elif action == 'append': options[dest] = [] 202 # else: options[dest] = None 203 # for name in names: 204 # if name.startswith('-'): 205 # self.fail('names must follow options') 206 # return _OptionVals(options), names 207 # class OptionGroup: 208 # def __init__(self, optparser, name): 209 # self.optparser = optparser 210 # self.name = name 211 212 # def add_option(self, *args, **kwargs): 213 # action = 'store' 214 # dest = None 215 # const = None 216 # for (key,val) in kwargs.items(): 217 # if key == 'action': action = val 218 # elif key == 'dest': dest = val 219 # elif key == 'const': const = val 220 # elif key in ('help', 'metavar'): pass 221 # else: self.fail('unsupported: %s' % key) 222 223 # if action not in ('store_const', 'store_true', 'store_false', 224 # 'store', 'count', 'append'): 225 # self.fail('unsupported action: %s' % action) 226 227 # optparser = self.optparser 228 # for arg in args: 229 # if arg.startswith('--'): 230 # optparser.longops.append(arg[2:]) 231 # elif arg.startswith('-') and len(arg)==2: 232 # optparser.shortops += arg[1] 233 # if action in ('store', 'append'): 234 # optparser.shortops += ':' 235 # else: 236 # self.fail('bad option name %s' % arg) 237 # if action == 'store_true': 238 # (action, const) = ('store_const', True) 239 # if action == 'store_false': 240 # (action, const) = ('store_const', False) 241 # optparser.option_specs[arg] = (action, dest, const) 242 243 # # Install a fake module. 244 # optparse = new.module('optparse') 245 # optparse.OptionParser = OptionParser 246 # optparse.OptionGroup = OptionGroup 247 # sys.modules['optparse'] = optparse 248 # # Clean up 249 # del OptionParser, OptionGroup 250
Home | Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Fri Jun 13 23:52:57 2008 | http://epydoc.sourceforge.net |