Package translate :: Package misc :: Package typecheck :: Module sets
[hide private]
[frames] | no frames]

Source Code for Module translate.misc.typecheck.sets

 1  from translate.misc.typecheck import CheckType, _TC_TypeError, check_type, Type 
 2  from translate.misc.typecheck import register_type, Or, _TC_Exception, _TC_KeyError 
 3  from translate.misc.typecheck import _TC_LengthError 
4 5 ### Provide typechecking for the built-in set() class 6 ### 7 ### XXX: Investigate rewriting this in terms of 8 ### UnorderedIteratorMixin or Or() 9 -class Set(CheckType):
10 - def __init__(self, set_list):
11 self.type = set(set_list) 12 self._types = [Type(t) for t in self.type] 13 14 # self._type is used to build _TC_TypeError 15 if len(self._types) > 1: 16 self._type = Or(*self.type) 17 elif len(self._types) == 1: 18 # XXX Is there an easier way to get this? 19 t = self.type.pop() 20 self._type = t 21 self.type.add(t)
22
23 - def __str__(self):
24 return "Set(" + str([e for e in self.type]) + ")"
25 26 __repr__ = __str__ 27
28 - def __typecheck__(self, func, to_check):
29 if not isinstance(to_check, set): 30 raise _TC_TypeError(to_check, self.type) 31 32 if len(self._types) == 0 and len(to_check) > 0: 33 raise _TC_LengthError(len(to_check), 0) 34 35 for obj in to_check: 36 error = False 37 for type in self._types: 38 try: 39 check_type(type, func, obj) 40 except _TC_Exception: 41 error = True 42 continue 43 else: 44 error = False 45 break 46 if error: 47 raise _TC_KeyError(obj, _TC_TypeError(obj, self._type))
48
49 - def __eq__(self, other):
50 if self.__class__ is not other.__class__: 51 return False 52 return self.type == other.type
53
54 - def __hash__(self):
55 return hash(str(hash(self.__class__)) + str(hash(frozenset(self.type))))
56 57 @classmethod
58 - def __typesig__(self, obj):
59 if isinstance(obj, set): 60 return Set(obj)
61 62 register_type(Set) 63