Package logilab-common-0 :: Package 36 :: Package 1 :: Module compat
[frames] | no frames]

Source Code for Module logilab-common-0.36.1.compat

  1  # pylint: disable-msg=E0601,W0622,W0611 
  2  """Wrappers around some builtins introduced in python 2.3, 2.4 and 
  3  2.5, making them available in for earlier versions of python. 
  4   
  5  :copyright: 2000-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved. 
  6  :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr 
  7  :license: General Public License version 2 - http://www.gnu.org/licenses 
  8  """ 
  9  from __future__ import generators 
 10  __docformat__ = "restructuredtext en" 
 11   
 12  from warnings import warn 
 13   
 14  import __builtin__ 
 15   
 16  from logilab.common.deprecation import class_renamed 
 17   
 18  try: 
 19      set = set 
 20      frozenset = frozenset 
 21  except NameError: 
 22      try: 
 23          from sets import Set as set, ImmutableSet as frozenset 
 24      except ImportError: 
25 - class _baseset(object):
26 - def __init__(self, values=()):
27 self._data = {} 28 warn("This implementation of Set is not complete !", 29 stacklevel=2) 30 for v in values: 31 self._data[v] = 1
32
33 - def __or__(self, other):
34 result = self.__class__(self._data.keys()) 35 for val in other: 36 result.add(val) 37 return result
38 __add__ = __or__ 39
40 - def __and__(self, other):
41 result = self.__class__() 42 for val in other: 43 if val in self._data: 44 result.add(val) 45 return result
46
47 - def __sub__(self, other):
48 result = self.__class__(self._data.keys()) 49 for val in other: 50 if val in self._data: 51 result.remove(val) 52 return result
53
54 - def __cmp__(self, other):
55 keys = self._data.keys() 56 okeys = other._data.keys() 57 keys.sort() 58 okeys.sort() 59 return cmp(keys, okeys)
60
61 - def __len__(self):
62 return len(self._data)
63
64 - def __repr__(self):
65 elements = self._data.keys() 66 return 'lcc.%s(%r)' % (self.__class__.__name__, elements)
67 __str__ = __repr__ 68
69 - def __iter__(self):
70 return iter(self._data)
71
72 - class frozenset(_baseset):
73 """immutable set (can be set in dictionnaries)"""
74 - def __init__(self, values=()):
75 super(frozenset, self).__init__(values) 76 self._hashcode = None
77
78 - def _compute_hash(self):
79 """taken from python stdlib (sets.py)""" 80 # Calculate hash code for a set by xor'ing the hash codes of 81 # the elements. This ensures that the hash code does not depend 82 # on the order in which elements are added to the set. This is 83 # not called __hash__ because a BaseSet should not be hashable; 84 # only an ImmutableSet is hashable. 85 result = 0 86 for elt in self: 87 result ^= hash(elt) 88 return result
89
90 - def __hash__(self):
91 """taken from python stdlib (sets.py)""" 92 if self._hashcode is None: 93 self._hashcode = self._compute_hash() 94 return self._hashcode
95 96
97 - class set(_baseset):
98 """mutable set"""
99 - def add(self, value):
100 self._data[value] = 1
101
102 - def remove(self, element):
103 """removes <element> from set""" 104 del self._data[element]
105
106 - def pop(self):
107 """pops an arbitrary element from set""" 108 return self._data.popitem()[0]
109
110 - def __hash__(self):
111 """mutable et cannot be hashed.""" 112 raise TypeError("set objects are not hashable")
113 114 del _baseset # don't explicity provide this class 115 116 Set = class_renamed('Set', set, 'logilab.common.compat.Set is deprecated, ' 117 'use logilab.common.compat.set instead') 118 119 try: 120 from itertools import izip, chain, imap 121 except ImportError: 122 # from itertools documentation ###
123 - def izip(*iterables):
124 iterables = map(iter, iterables) 125 while iterables: 126 result = [i.next() for i in iterables] 127 yield tuple(result)
128
129 - def chain(*iterables):
130 for it in iterables: 131 for element in it: 132 yield element
133
134 - def imap(function, *iterables):
135 iterables = map(iter, iterables) 136 while True: 137 args = [i.next() for i in iterables] 138 if function is None: 139 yield tuple(args) 140 else: 141 yield function(*args)
142 try: 143 sum = sum 144 enumerate = enumerate 145 except NameError: 146 # define the sum and enumerate functions (builtins introduced in py 2.3) 147 import operator
148 - def sum(seq, start=0):
149 """Returns the sum of all elements in the sequence""" 150 return reduce(operator.add, seq, start)
151
152 - def enumerate(iterable):
153 """emulates the python2.3 enumerate() function""" 154 i = 0 155 for val in iterable: 156 yield i, val 157 i += 1
158 #return zip(range(len(iterable)), iterable) 159 try: 160 sorted = sorted 161 reversed = reversed 162 except NameError: 163
164 - def sorted(iterable, cmp=None, key=None, reverse=False):
165 original = list(iterable) 166 if key: 167 l2 = [(key(elt), index) for index, elt in enumerate(original)] 168 else: 169 l2 = original 170 l2.sort(cmp) 171 if reverse: 172 l2.reverse() 173 if key: 174 return [original[index] for elt, index in l2] 175 return l2
176
177 - def reversed(l):
178 l2 = list(l) 179 l2.reverse() 180 return l2
181 182 try: # 183 max = max 184 max(("ab","cde"),key=len) 185 except TypeError:
186 - def max( *args, **kargs):
187 if len(args) == 0: 188 raise TypeError("max expected at least 1 arguments, got 0") 189 key= kargs.pop("key", None) 190 #default implementation 191 if key is None: 192 return __builtin__.max(*args,**kargs) 193 194 for karg in kargs: 195 raise TypeError("unexpected keyword argument %s for function max") % karg 196 197 if len(args) == 1: 198 items = iter(args[0]) 199 else: 200 items = iter(args) 201 202 try: 203 best_item = items.next() 204 best_value = key(best_item) 205 except StopIteration: 206 raise ValueError("max() arg is an empty sequence") 207 208 for item in items: 209 value = key(item) 210 if value > best_value: 211 best_item = item 212 best_value = value 213 214 return best_item
215 216 217 218 219 220 # Python2.5 builtins 221 try: 222 any = any 223 all = all 224 except NameError:
225 - def any(iterable):
226 """any(iterable) -> bool 227 228 Return True if bool(x) is True for any x in the iterable. 229 """ 230 for elt in iterable: 231 if elt: 232 return True 233 return False
234
235 - def all(iterable):
236 """all(iterable) -> bool 237 238 Return True if bool(x) is True for all values x in the iterable. 239 """ 240 for elt in iterable: 241 if not elt: 242 return False 243 return True
244