1*cda5da8dSAndroid Build Coastguard Worker""" 2*cda5da8dSAndroid Build Coastguard WorkerOperator Interface 3*cda5da8dSAndroid Build Coastguard Worker 4*cda5da8dSAndroid Build Coastguard WorkerThis module exports a set of functions corresponding to the intrinsic 5*cda5da8dSAndroid Build Coastguard Workeroperators of Python. For example, operator.add(x, y) is equivalent 6*cda5da8dSAndroid Build Coastguard Workerto the expression x+y. The function names are those used for special 7*cda5da8dSAndroid Build Coastguard Workermethods; variants without leading and trailing '__' are also provided 8*cda5da8dSAndroid Build Coastguard Workerfor convenience. 9*cda5da8dSAndroid Build Coastguard Worker 10*cda5da8dSAndroid Build Coastguard WorkerThis is the pure Python implementation of the module. 11*cda5da8dSAndroid Build Coastguard Worker""" 12*cda5da8dSAndroid Build Coastguard Worker 13*cda5da8dSAndroid Build Coastguard Worker__all__ = ['abs', 'add', 'and_', 'attrgetter', 'call', 'concat', 'contains', 'countOf', 14*cda5da8dSAndroid Build Coastguard Worker 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand', 15*cda5da8dSAndroid Build Coastguard Worker 'iconcat', 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul', 16*cda5da8dSAndroid Build Coastguard Worker 'index', 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift', 17*cda5da8dSAndroid Build Coastguard Worker 'is_', 'is_not', 'isub', 'itemgetter', 'itruediv', 'ixor', 'le', 18*cda5da8dSAndroid Build Coastguard Worker 'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller', 'mod', 19*cda5da8dSAndroid Build Coastguard Worker 'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift', 20*cda5da8dSAndroid Build Coastguard Worker 'setitem', 'sub', 'truediv', 'truth', 'xor'] 21*cda5da8dSAndroid Build Coastguard Worker 22*cda5da8dSAndroid Build Coastguard Workerfrom builtins import abs as _abs 23*cda5da8dSAndroid Build Coastguard Worker 24*cda5da8dSAndroid Build Coastguard Worker 25*cda5da8dSAndroid Build Coastguard Worker# Comparison Operations *******************************************************# 26*cda5da8dSAndroid Build Coastguard Worker 27*cda5da8dSAndroid Build Coastguard Workerdef lt(a, b): 28*cda5da8dSAndroid Build Coastguard Worker "Same as a < b." 29*cda5da8dSAndroid Build Coastguard Worker return a < b 30*cda5da8dSAndroid Build Coastguard Worker 31*cda5da8dSAndroid Build Coastguard Workerdef le(a, b): 32*cda5da8dSAndroid Build Coastguard Worker "Same as a <= b." 33*cda5da8dSAndroid Build Coastguard Worker return a <= b 34*cda5da8dSAndroid Build Coastguard Worker 35*cda5da8dSAndroid Build Coastguard Workerdef eq(a, b): 36*cda5da8dSAndroid Build Coastguard Worker "Same as a == b." 37*cda5da8dSAndroid Build Coastguard Worker return a == b 38*cda5da8dSAndroid Build Coastguard Worker 39*cda5da8dSAndroid Build Coastguard Workerdef ne(a, b): 40*cda5da8dSAndroid Build Coastguard Worker "Same as a != b." 41*cda5da8dSAndroid Build Coastguard Worker return a != b 42*cda5da8dSAndroid Build Coastguard Worker 43*cda5da8dSAndroid Build Coastguard Workerdef ge(a, b): 44*cda5da8dSAndroid Build Coastguard Worker "Same as a >= b." 45*cda5da8dSAndroid Build Coastguard Worker return a >= b 46*cda5da8dSAndroid Build Coastguard Worker 47*cda5da8dSAndroid Build Coastguard Workerdef gt(a, b): 48*cda5da8dSAndroid Build Coastguard Worker "Same as a > b." 49*cda5da8dSAndroid Build Coastguard Worker return a > b 50*cda5da8dSAndroid Build Coastguard Worker 51*cda5da8dSAndroid Build Coastguard Worker# Logical Operations **********************************************************# 52*cda5da8dSAndroid Build Coastguard Worker 53*cda5da8dSAndroid Build Coastguard Workerdef not_(a): 54*cda5da8dSAndroid Build Coastguard Worker "Same as not a." 55*cda5da8dSAndroid Build Coastguard Worker return not a 56*cda5da8dSAndroid Build Coastguard Worker 57*cda5da8dSAndroid Build Coastguard Workerdef truth(a): 58*cda5da8dSAndroid Build Coastguard Worker "Return True if a is true, False otherwise." 59*cda5da8dSAndroid Build Coastguard Worker return True if a else False 60*cda5da8dSAndroid Build Coastguard Worker 61*cda5da8dSAndroid Build Coastguard Workerdef is_(a, b): 62*cda5da8dSAndroid Build Coastguard Worker "Same as a is b." 63*cda5da8dSAndroid Build Coastguard Worker return a is b 64*cda5da8dSAndroid Build Coastguard Worker 65*cda5da8dSAndroid Build Coastguard Workerdef is_not(a, b): 66*cda5da8dSAndroid Build Coastguard Worker "Same as a is not b." 67*cda5da8dSAndroid Build Coastguard Worker return a is not b 68*cda5da8dSAndroid Build Coastguard Worker 69*cda5da8dSAndroid Build Coastguard Worker# Mathematical/Bitwise Operations *********************************************# 70*cda5da8dSAndroid Build Coastguard Worker 71*cda5da8dSAndroid Build Coastguard Workerdef abs(a): 72*cda5da8dSAndroid Build Coastguard Worker "Same as abs(a)." 73*cda5da8dSAndroid Build Coastguard Worker return _abs(a) 74*cda5da8dSAndroid Build Coastguard Worker 75*cda5da8dSAndroid Build Coastguard Workerdef add(a, b): 76*cda5da8dSAndroid Build Coastguard Worker "Same as a + b." 77*cda5da8dSAndroid Build Coastguard Worker return a + b 78*cda5da8dSAndroid Build Coastguard Worker 79*cda5da8dSAndroid Build Coastguard Workerdef and_(a, b): 80*cda5da8dSAndroid Build Coastguard Worker "Same as a & b." 81*cda5da8dSAndroid Build Coastguard Worker return a & b 82*cda5da8dSAndroid Build Coastguard Worker 83*cda5da8dSAndroid Build Coastguard Workerdef floordiv(a, b): 84*cda5da8dSAndroid Build Coastguard Worker "Same as a // b." 85*cda5da8dSAndroid Build Coastguard Worker return a // b 86*cda5da8dSAndroid Build Coastguard Worker 87*cda5da8dSAndroid Build Coastguard Workerdef index(a): 88*cda5da8dSAndroid Build Coastguard Worker "Same as a.__index__()." 89*cda5da8dSAndroid Build Coastguard Worker return a.__index__() 90*cda5da8dSAndroid Build Coastguard Worker 91*cda5da8dSAndroid Build Coastguard Workerdef inv(a): 92*cda5da8dSAndroid Build Coastguard Worker "Same as ~a." 93*cda5da8dSAndroid Build Coastguard Worker return ~a 94*cda5da8dSAndroid Build Coastguard Workerinvert = inv 95*cda5da8dSAndroid Build Coastguard Worker 96*cda5da8dSAndroid Build Coastguard Workerdef lshift(a, b): 97*cda5da8dSAndroid Build Coastguard Worker "Same as a << b." 98*cda5da8dSAndroid Build Coastguard Worker return a << b 99*cda5da8dSAndroid Build Coastguard Worker 100*cda5da8dSAndroid Build Coastguard Workerdef mod(a, b): 101*cda5da8dSAndroid Build Coastguard Worker "Same as a % b." 102*cda5da8dSAndroid Build Coastguard Worker return a % b 103*cda5da8dSAndroid Build Coastguard Worker 104*cda5da8dSAndroid Build Coastguard Workerdef mul(a, b): 105*cda5da8dSAndroid Build Coastguard Worker "Same as a * b." 106*cda5da8dSAndroid Build Coastguard Worker return a * b 107*cda5da8dSAndroid Build Coastguard Worker 108*cda5da8dSAndroid Build Coastguard Workerdef matmul(a, b): 109*cda5da8dSAndroid Build Coastguard Worker "Same as a @ b." 110*cda5da8dSAndroid Build Coastguard Worker return a @ b 111*cda5da8dSAndroid Build Coastguard Worker 112*cda5da8dSAndroid Build Coastguard Workerdef neg(a): 113*cda5da8dSAndroid Build Coastguard Worker "Same as -a." 114*cda5da8dSAndroid Build Coastguard Worker return -a 115*cda5da8dSAndroid Build Coastguard Worker 116*cda5da8dSAndroid Build Coastguard Workerdef or_(a, b): 117*cda5da8dSAndroid Build Coastguard Worker "Same as a | b." 118*cda5da8dSAndroid Build Coastguard Worker return a | b 119*cda5da8dSAndroid Build Coastguard Worker 120*cda5da8dSAndroid Build Coastguard Workerdef pos(a): 121*cda5da8dSAndroid Build Coastguard Worker "Same as +a." 122*cda5da8dSAndroid Build Coastguard Worker return +a 123*cda5da8dSAndroid Build Coastguard Worker 124*cda5da8dSAndroid Build Coastguard Workerdef pow(a, b): 125*cda5da8dSAndroid Build Coastguard Worker "Same as a ** b." 126*cda5da8dSAndroid Build Coastguard Worker return a ** b 127*cda5da8dSAndroid Build Coastguard Worker 128*cda5da8dSAndroid Build Coastguard Workerdef rshift(a, b): 129*cda5da8dSAndroid Build Coastguard Worker "Same as a >> b." 130*cda5da8dSAndroid Build Coastguard Worker return a >> b 131*cda5da8dSAndroid Build Coastguard Worker 132*cda5da8dSAndroid Build Coastguard Workerdef sub(a, b): 133*cda5da8dSAndroid Build Coastguard Worker "Same as a - b." 134*cda5da8dSAndroid Build Coastguard Worker return a - b 135*cda5da8dSAndroid Build Coastguard Worker 136*cda5da8dSAndroid Build Coastguard Workerdef truediv(a, b): 137*cda5da8dSAndroid Build Coastguard Worker "Same as a / b." 138*cda5da8dSAndroid Build Coastguard Worker return a / b 139*cda5da8dSAndroid Build Coastguard Worker 140*cda5da8dSAndroid Build Coastguard Workerdef xor(a, b): 141*cda5da8dSAndroid Build Coastguard Worker "Same as a ^ b." 142*cda5da8dSAndroid Build Coastguard Worker return a ^ b 143*cda5da8dSAndroid Build Coastguard Worker 144*cda5da8dSAndroid Build Coastguard Worker# Sequence Operations *********************************************************# 145*cda5da8dSAndroid Build Coastguard Worker 146*cda5da8dSAndroid Build Coastguard Workerdef concat(a, b): 147*cda5da8dSAndroid Build Coastguard Worker "Same as a + b, for a and b sequences." 148*cda5da8dSAndroid Build Coastguard Worker if not hasattr(a, '__getitem__'): 149*cda5da8dSAndroid Build Coastguard Worker msg = "'%s' object can't be concatenated" % type(a).__name__ 150*cda5da8dSAndroid Build Coastguard Worker raise TypeError(msg) 151*cda5da8dSAndroid Build Coastguard Worker return a + b 152*cda5da8dSAndroid Build Coastguard Worker 153*cda5da8dSAndroid Build Coastguard Workerdef contains(a, b): 154*cda5da8dSAndroid Build Coastguard Worker "Same as b in a (note reversed operands)." 155*cda5da8dSAndroid Build Coastguard Worker return b in a 156*cda5da8dSAndroid Build Coastguard Worker 157*cda5da8dSAndroid Build Coastguard Workerdef countOf(a, b): 158*cda5da8dSAndroid Build Coastguard Worker "Return the number of items in a which are, or which equal, b." 159*cda5da8dSAndroid Build Coastguard Worker count = 0 160*cda5da8dSAndroid Build Coastguard Worker for i in a: 161*cda5da8dSAndroid Build Coastguard Worker if i is b or i == b: 162*cda5da8dSAndroid Build Coastguard Worker count += 1 163*cda5da8dSAndroid Build Coastguard Worker return count 164*cda5da8dSAndroid Build Coastguard Worker 165*cda5da8dSAndroid Build Coastguard Workerdef delitem(a, b): 166*cda5da8dSAndroid Build Coastguard Worker "Same as del a[b]." 167*cda5da8dSAndroid Build Coastguard Worker del a[b] 168*cda5da8dSAndroid Build Coastguard Worker 169*cda5da8dSAndroid Build Coastguard Workerdef getitem(a, b): 170*cda5da8dSAndroid Build Coastguard Worker "Same as a[b]." 171*cda5da8dSAndroid Build Coastguard Worker return a[b] 172*cda5da8dSAndroid Build Coastguard Worker 173*cda5da8dSAndroid Build Coastguard Workerdef indexOf(a, b): 174*cda5da8dSAndroid Build Coastguard Worker "Return the first index of b in a." 175*cda5da8dSAndroid Build Coastguard Worker for i, j in enumerate(a): 176*cda5da8dSAndroid Build Coastguard Worker if j is b or j == b: 177*cda5da8dSAndroid Build Coastguard Worker return i 178*cda5da8dSAndroid Build Coastguard Worker else: 179*cda5da8dSAndroid Build Coastguard Worker raise ValueError('sequence.index(x): x not in sequence') 180*cda5da8dSAndroid Build Coastguard Worker 181*cda5da8dSAndroid Build Coastguard Workerdef setitem(a, b, c): 182*cda5da8dSAndroid Build Coastguard Worker "Same as a[b] = c." 183*cda5da8dSAndroid Build Coastguard Worker a[b] = c 184*cda5da8dSAndroid Build Coastguard Worker 185*cda5da8dSAndroid Build Coastguard Workerdef length_hint(obj, default=0): 186*cda5da8dSAndroid Build Coastguard Worker """ 187*cda5da8dSAndroid Build Coastguard Worker Return an estimate of the number of items in obj. 188*cda5da8dSAndroid Build Coastguard Worker This is useful for presizing containers when building from an iterable. 189*cda5da8dSAndroid Build Coastguard Worker 190*cda5da8dSAndroid Build Coastguard Worker If the object supports len(), the result will be exact. Otherwise, it may 191*cda5da8dSAndroid Build Coastguard Worker over- or under-estimate by an arbitrary amount. The result will be an 192*cda5da8dSAndroid Build Coastguard Worker integer >= 0. 193*cda5da8dSAndroid Build Coastguard Worker """ 194*cda5da8dSAndroid Build Coastguard Worker if not isinstance(default, int): 195*cda5da8dSAndroid Build Coastguard Worker msg = ("'%s' object cannot be interpreted as an integer" % 196*cda5da8dSAndroid Build Coastguard Worker type(default).__name__) 197*cda5da8dSAndroid Build Coastguard Worker raise TypeError(msg) 198*cda5da8dSAndroid Build Coastguard Worker 199*cda5da8dSAndroid Build Coastguard Worker try: 200*cda5da8dSAndroid Build Coastguard Worker return len(obj) 201*cda5da8dSAndroid Build Coastguard Worker except TypeError: 202*cda5da8dSAndroid Build Coastguard Worker pass 203*cda5da8dSAndroid Build Coastguard Worker 204*cda5da8dSAndroid Build Coastguard Worker try: 205*cda5da8dSAndroid Build Coastguard Worker hint = type(obj).__length_hint__ 206*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 207*cda5da8dSAndroid Build Coastguard Worker return default 208*cda5da8dSAndroid Build Coastguard Worker 209*cda5da8dSAndroid Build Coastguard Worker try: 210*cda5da8dSAndroid Build Coastguard Worker val = hint(obj) 211*cda5da8dSAndroid Build Coastguard Worker except TypeError: 212*cda5da8dSAndroid Build Coastguard Worker return default 213*cda5da8dSAndroid Build Coastguard Worker if val is NotImplemented: 214*cda5da8dSAndroid Build Coastguard Worker return default 215*cda5da8dSAndroid Build Coastguard Worker if not isinstance(val, int): 216*cda5da8dSAndroid Build Coastguard Worker msg = ('__length_hint__ must be integer, not %s' % 217*cda5da8dSAndroid Build Coastguard Worker type(val).__name__) 218*cda5da8dSAndroid Build Coastguard Worker raise TypeError(msg) 219*cda5da8dSAndroid Build Coastguard Worker if val < 0: 220*cda5da8dSAndroid Build Coastguard Worker msg = '__length_hint__() should return >= 0' 221*cda5da8dSAndroid Build Coastguard Worker raise ValueError(msg) 222*cda5da8dSAndroid Build Coastguard Worker return val 223*cda5da8dSAndroid Build Coastguard Worker 224*cda5da8dSAndroid Build Coastguard Worker# Other Operations ************************************************************# 225*cda5da8dSAndroid Build Coastguard Worker 226*cda5da8dSAndroid Build Coastguard Workerdef call(obj, /, *args, **kwargs): 227*cda5da8dSAndroid Build Coastguard Worker """Same as obj(*args, **kwargs).""" 228*cda5da8dSAndroid Build Coastguard Worker return obj(*args, **kwargs) 229*cda5da8dSAndroid Build Coastguard Worker 230*cda5da8dSAndroid Build Coastguard Worker# Generalized Lookup Objects **************************************************# 231*cda5da8dSAndroid Build Coastguard Worker 232*cda5da8dSAndroid Build Coastguard Workerclass attrgetter: 233*cda5da8dSAndroid Build Coastguard Worker """ 234*cda5da8dSAndroid Build Coastguard Worker Return a callable object that fetches the given attribute(s) from its operand. 235*cda5da8dSAndroid Build Coastguard Worker After f = attrgetter('name'), the call f(r) returns r.name. 236*cda5da8dSAndroid Build Coastguard Worker After g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date). 237*cda5da8dSAndroid Build Coastguard Worker After h = attrgetter('name.first', 'name.last'), the call h(r) returns 238*cda5da8dSAndroid Build Coastguard Worker (r.name.first, r.name.last). 239*cda5da8dSAndroid Build Coastguard Worker """ 240*cda5da8dSAndroid Build Coastguard Worker __slots__ = ('_attrs', '_call') 241*cda5da8dSAndroid Build Coastguard Worker 242*cda5da8dSAndroid Build Coastguard Worker def __init__(self, attr, *attrs): 243*cda5da8dSAndroid Build Coastguard Worker if not attrs: 244*cda5da8dSAndroid Build Coastguard Worker if not isinstance(attr, str): 245*cda5da8dSAndroid Build Coastguard Worker raise TypeError('attribute name must be a string') 246*cda5da8dSAndroid Build Coastguard Worker self._attrs = (attr,) 247*cda5da8dSAndroid Build Coastguard Worker names = attr.split('.') 248*cda5da8dSAndroid Build Coastguard Worker def func(obj): 249*cda5da8dSAndroid Build Coastguard Worker for name in names: 250*cda5da8dSAndroid Build Coastguard Worker obj = getattr(obj, name) 251*cda5da8dSAndroid Build Coastguard Worker return obj 252*cda5da8dSAndroid Build Coastguard Worker self._call = func 253*cda5da8dSAndroid Build Coastguard Worker else: 254*cda5da8dSAndroid Build Coastguard Worker self._attrs = (attr,) + attrs 255*cda5da8dSAndroid Build Coastguard Worker getters = tuple(map(attrgetter, self._attrs)) 256*cda5da8dSAndroid Build Coastguard Worker def func(obj): 257*cda5da8dSAndroid Build Coastguard Worker return tuple(getter(obj) for getter in getters) 258*cda5da8dSAndroid Build Coastguard Worker self._call = func 259*cda5da8dSAndroid Build Coastguard Worker 260*cda5da8dSAndroid Build Coastguard Worker def __call__(self, obj): 261*cda5da8dSAndroid Build Coastguard Worker return self._call(obj) 262*cda5da8dSAndroid Build Coastguard Worker 263*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 264*cda5da8dSAndroid Build Coastguard Worker return '%s.%s(%s)' % (self.__class__.__module__, 265*cda5da8dSAndroid Build Coastguard Worker self.__class__.__qualname__, 266*cda5da8dSAndroid Build Coastguard Worker ', '.join(map(repr, self._attrs))) 267*cda5da8dSAndroid Build Coastguard Worker 268*cda5da8dSAndroid Build Coastguard Worker def __reduce__(self): 269*cda5da8dSAndroid Build Coastguard Worker return self.__class__, self._attrs 270*cda5da8dSAndroid Build Coastguard Worker 271*cda5da8dSAndroid Build Coastguard Workerclass itemgetter: 272*cda5da8dSAndroid Build Coastguard Worker """ 273*cda5da8dSAndroid Build Coastguard Worker Return a callable object that fetches the given item(s) from its operand. 274*cda5da8dSAndroid Build Coastguard Worker After f = itemgetter(2), the call f(r) returns r[2]. 275*cda5da8dSAndroid Build Coastguard Worker After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3]) 276*cda5da8dSAndroid Build Coastguard Worker """ 277*cda5da8dSAndroid Build Coastguard Worker __slots__ = ('_items', '_call') 278*cda5da8dSAndroid Build Coastguard Worker 279*cda5da8dSAndroid Build Coastguard Worker def __init__(self, item, *items): 280*cda5da8dSAndroid Build Coastguard Worker if not items: 281*cda5da8dSAndroid Build Coastguard Worker self._items = (item,) 282*cda5da8dSAndroid Build Coastguard Worker def func(obj): 283*cda5da8dSAndroid Build Coastguard Worker return obj[item] 284*cda5da8dSAndroid Build Coastguard Worker self._call = func 285*cda5da8dSAndroid Build Coastguard Worker else: 286*cda5da8dSAndroid Build Coastguard Worker self._items = items = (item,) + items 287*cda5da8dSAndroid Build Coastguard Worker def func(obj): 288*cda5da8dSAndroid Build Coastguard Worker return tuple(obj[i] for i in items) 289*cda5da8dSAndroid Build Coastguard Worker self._call = func 290*cda5da8dSAndroid Build Coastguard Worker 291*cda5da8dSAndroid Build Coastguard Worker def __call__(self, obj): 292*cda5da8dSAndroid Build Coastguard Worker return self._call(obj) 293*cda5da8dSAndroid Build Coastguard Worker 294*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 295*cda5da8dSAndroid Build Coastguard Worker return '%s.%s(%s)' % (self.__class__.__module__, 296*cda5da8dSAndroid Build Coastguard Worker self.__class__.__name__, 297*cda5da8dSAndroid Build Coastguard Worker ', '.join(map(repr, self._items))) 298*cda5da8dSAndroid Build Coastguard Worker 299*cda5da8dSAndroid Build Coastguard Worker def __reduce__(self): 300*cda5da8dSAndroid Build Coastguard Worker return self.__class__, self._items 301*cda5da8dSAndroid Build Coastguard Worker 302*cda5da8dSAndroid Build Coastguard Workerclass methodcaller: 303*cda5da8dSAndroid Build Coastguard Worker """ 304*cda5da8dSAndroid Build Coastguard Worker Return a callable object that calls the given method on its operand. 305*cda5da8dSAndroid Build Coastguard Worker After f = methodcaller('name'), the call f(r) returns r.name(). 306*cda5da8dSAndroid Build Coastguard Worker After g = methodcaller('name', 'date', foo=1), the call g(r) returns 307*cda5da8dSAndroid Build Coastguard Worker r.name('date', foo=1). 308*cda5da8dSAndroid Build Coastguard Worker """ 309*cda5da8dSAndroid Build Coastguard Worker __slots__ = ('_name', '_args', '_kwargs') 310*cda5da8dSAndroid Build Coastguard Worker 311*cda5da8dSAndroid Build Coastguard Worker def __init__(self, name, /, *args, **kwargs): 312*cda5da8dSAndroid Build Coastguard Worker self._name = name 313*cda5da8dSAndroid Build Coastguard Worker if not isinstance(self._name, str): 314*cda5da8dSAndroid Build Coastguard Worker raise TypeError('method name must be a string') 315*cda5da8dSAndroid Build Coastguard Worker self._args = args 316*cda5da8dSAndroid Build Coastguard Worker self._kwargs = kwargs 317*cda5da8dSAndroid Build Coastguard Worker 318*cda5da8dSAndroid Build Coastguard Worker def __call__(self, obj): 319*cda5da8dSAndroid Build Coastguard Worker return getattr(obj, self._name)(*self._args, **self._kwargs) 320*cda5da8dSAndroid Build Coastguard Worker 321*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 322*cda5da8dSAndroid Build Coastguard Worker args = [repr(self._name)] 323*cda5da8dSAndroid Build Coastguard Worker args.extend(map(repr, self._args)) 324*cda5da8dSAndroid Build Coastguard Worker args.extend('%s=%r' % (k, v) for k, v in self._kwargs.items()) 325*cda5da8dSAndroid Build Coastguard Worker return '%s.%s(%s)' % (self.__class__.__module__, 326*cda5da8dSAndroid Build Coastguard Worker self.__class__.__name__, 327*cda5da8dSAndroid Build Coastguard Worker ', '.join(args)) 328*cda5da8dSAndroid Build Coastguard Worker 329*cda5da8dSAndroid Build Coastguard Worker def __reduce__(self): 330*cda5da8dSAndroid Build Coastguard Worker if not self._kwargs: 331*cda5da8dSAndroid Build Coastguard Worker return self.__class__, (self._name,) + self._args 332*cda5da8dSAndroid Build Coastguard Worker else: 333*cda5da8dSAndroid Build Coastguard Worker from functools import partial 334*cda5da8dSAndroid Build Coastguard Worker return partial(self.__class__, self._name, **self._kwargs), self._args 335*cda5da8dSAndroid Build Coastguard Worker 336*cda5da8dSAndroid Build Coastguard Worker 337*cda5da8dSAndroid Build Coastguard Worker# In-place Operations *********************************************************# 338*cda5da8dSAndroid Build Coastguard Worker 339*cda5da8dSAndroid Build Coastguard Workerdef iadd(a, b): 340*cda5da8dSAndroid Build Coastguard Worker "Same as a += b." 341*cda5da8dSAndroid Build Coastguard Worker a += b 342*cda5da8dSAndroid Build Coastguard Worker return a 343*cda5da8dSAndroid Build Coastguard Worker 344*cda5da8dSAndroid Build Coastguard Workerdef iand(a, b): 345*cda5da8dSAndroid Build Coastguard Worker "Same as a &= b." 346*cda5da8dSAndroid Build Coastguard Worker a &= b 347*cda5da8dSAndroid Build Coastguard Worker return a 348*cda5da8dSAndroid Build Coastguard Worker 349*cda5da8dSAndroid Build Coastguard Workerdef iconcat(a, b): 350*cda5da8dSAndroid Build Coastguard Worker "Same as a += b, for a and b sequences." 351*cda5da8dSAndroid Build Coastguard Worker if not hasattr(a, '__getitem__'): 352*cda5da8dSAndroid Build Coastguard Worker msg = "'%s' object can't be concatenated" % type(a).__name__ 353*cda5da8dSAndroid Build Coastguard Worker raise TypeError(msg) 354*cda5da8dSAndroid Build Coastguard Worker a += b 355*cda5da8dSAndroid Build Coastguard Worker return a 356*cda5da8dSAndroid Build Coastguard Worker 357*cda5da8dSAndroid Build Coastguard Workerdef ifloordiv(a, b): 358*cda5da8dSAndroid Build Coastguard Worker "Same as a //= b." 359*cda5da8dSAndroid Build Coastguard Worker a //= b 360*cda5da8dSAndroid Build Coastguard Worker return a 361*cda5da8dSAndroid Build Coastguard Worker 362*cda5da8dSAndroid Build Coastguard Workerdef ilshift(a, b): 363*cda5da8dSAndroid Build Coastguard Worker "Same as a <<= b." 364*cda5da8dSAndroid Build Coastguard Worker a <<= b 365*cda5da8dSAndroid Build Coastguard Worker return a 366*cda5da8dSAndroid Build Coastguard Worker 367*cda5da8dSAndroid Build Coastguard Workerdef imod(a, b): 368*cda5da8dSAndroid Build Coastguard Worker "Same as a %= b." 369*cda5da8dSAndroid Build Coastguard Worker a %= b 370*cda5da8dSAndroid Build Coastguard Worker return a 371*cda5da8dSAndroid Build Coastguard Worker 372*cda5da8dSAndroid Build Coastguard Workerdef imul(a, b): 373*cda5da8dSAndroid Build Coastguard Worker "Same as a *= b." 374*cda5da8dSAndroid Build Coastguard Worker a *= b 375*cda5da8dSAndroid Build Coastguard Worker return a 376*cda5da8dSAndroid Build Coastguard Worker 377*cda5da8dSAndroid Build Coastguard Workerdef imatmul(a, b): 378*cda5da8dSAndroid Build Coastguard Worker "Same as a @= b." 379*cda5da8dSAndroid Build Coastguard Worker a @= b 380*cda5da8dSAndroid Build Coastguard Worker return a 381*cda5da8dSAndroid Build Coastguard Worker 382*cda5da8dSAndroid Build Coastguard Workerdef ior(a, b): 383*cda5da8dSAndroid Build Coastguard Worker "Same as a |= b." 384*cda5da8dSAndroid Build Coastguard Worker a |= b 385*cda5da8dSAndroid Build Coastguard Worker return a 386*cda5da8dSAndroid Build Coastguard Worker 387*cda5da8dSAndroid Build Coastguard Workerdef ipow(a, b): 388*cda5da8dSAndroid Build Coastguard Worker "Same as a **= b." 389*cda5da8dSAndroid Build Coastguard Worker a **=b 390*cda5da8dSAndroid Build Coastguard Worker return a 391*cda5da8dSAndroid Build Coastguard Worker 392*cda5da8dSAndroid Build Coastguard Workerdef irshift(a, b): 393*cda5da8dSAndroid Build Coastguard Worker "Same as a >>= b." 394*cda5da8dSAndroid Build Coastguard Worker a >>= b 395*cda5da8dSAndroid Build Coastguard Worker return a 396*cda5da8dSAndroid Build Coastguard Worker 397*cda5da8dSAndroid Build Coastguard Workerdef isub(a, b): 398*cda5da8dSAndroid Build Coastguard Worker "Same as a -= b." 399*cda5da8dSAndroid Build Coastguard Worker a -= b 400*cda5da8dSAndroid Build Coastguard Worker return a 401*cda5da8dSAndroid Build Coastguard Worker 402*cda5da8dSAndroid Build Coastguard Workerdef itruediv(a, b): 403*cda5da8dSAndroid Build Coastguard Worker "Same as a /= b." 404*cda5da8dSAndroid Build Coastguard Worker a /= b 405*cda5da8dSAndroid Build Coastguard Worker return a 406*cda5da8dSAndroid Build Coastguard Worker 407*cda5da8dSAndroid Build Coastguard Workerdef ixor(a, b): 408*cda5da8dSAndroid Build Coastguard Worker "Same as a ^= b." 409*cda5da8dSAndroid Build Coastguard Worker a ^= b 410*cda5da8dSAndroid Build Coastguard Worker return a 411*cda5da8dSAndroid Build Coastguard Worker 412*cda5da8dSAndroid Build Coastguard Worker 413*cda5da8dSAndroid Build Coastguard Workertry: 414*cda5da8dSAndroid Build Coastguard Worker from _operator import * 415*cda5da8dSAndroid Build Coastguard Workerexcept ImportError: 416*cda5da8dSAndroid Build Coastguard Worker pass 417*cda5da8dSAndroid Build Coastguard Workerelse: 418*cda5da8dSAndroid Build Coastguard Worker from _operator import __doc__ 419*cda5da8dSAndroid Build Coastguard Worker 420*cda5da8dSAndroid Build Coastguard Worker# All of these "__func__ = func" assignments have to happen after importing 421*cda5da8dSAndroid Build Coastguard Worker# from _operator to make sure they're set to the right function 422*cda5da8dSAndroid Build Coastguard Worker__lt__ = lt 423*cda5da8dSAndroid Build Coastguard Worker__le__ = le 424*cda5da8dSAndroid Build Coastguard Worker__eq__ = eq 425*cda5da8dSAndroid Build Coastguard Worker__ne__ = ne 426*cda5da8dSAndroid Build Coastguard Worker__ge__ = ge 427*cda5da8dSAndroid Build Coastguard Worker__gt__ = gt 428*cda5da8dSAndroid Build Coastguard Worker__not__ = not_ 429*cda5da8dSAndroid Build Coastguard Worker__abs__ = abs 430*cda5da8dSAndroid Build Coastguard Worker__add__ = add 431*cda5da8dSAndroid Build Coastguard Worker__and__ = and_ 432*cda5da8dSAndroid Build Coastguard Worker__call__ = call 433*cda5da8dSAndroid Build Coastguard Worker__floordiv__ = floordiv 434*cda5da8dSAndroid Build Coastguard Worker__index__ = index 435*cda5da8dSAndroid Build Coastguard Worker__inv__ = inv 436*cda5da8dSAndroid Build Coastguard Worker__invert__ = invert 437*cda5da8dSAndroid Build Coastguard Worker__lshift__ = lshift 438*cda5da8dSAndroid Build Coastguard Worker__mod__ = mod 439*cda5da8dSAndroid Build Coastguard Worker__mul__ = mul 440*cda5da8dSAndroid Build Coastguard Worker__matmul__ = matmul 441*cda5da8dSAndroid Build Coastguard Worker__neg__ = neg 442*cda5da8dSAndroid Build Coastguard Worker__or__ = or_ 443*cda5da8dSAndroid Build Coastguard Worker__pos__ = pos 444*cda5da8dSAndroid Build Coastguard Worker__pow__ = pow 445*cda5da8dSAndroid Build Coastguard Worker__rshift__ = rshift 446*cda5da8dSAndroid Build Coastguard Worker__sub__ = sub 447*cda5da8dSAndroid Build Coastguard Worker__truediv__ = truediv 448*cda5da8dSAndroid Build Coastguard Worker__xor__ = xor 449*cda5da8dSAndroid Build Coastguard Worker__concat__ = concat 450*cda5da8dSAndroid Build Coastguard Worker__contains__ = contains 451*cda5da8dSAndroid Build Coastguard Worker__delitem__ = delitem 452*cda5da8dSAndroid Build Coastguard Worker__getitem__ = getitem 453*cda5da8dSAndroid Build Coastguard Worker__setitem__ = setitem 454*cda5da8dSAndroid Build Coastguard Worker__iadd__ = iadd 455*cda5da8dSAndroid Build Coastguard Worker__iand__ = iand 456*cda5da8dSAndroid Build Coastguard Worker__iconcat__ = iconcat 457*cda5da8dSAndroid Build Coastguard Worker__ifloordiv__ = ifloordiv 458*cda5da8dSAndroid Build Coastguard Worker__ilshift__ = ilshift 459*cda5da8dSAndroid Build Coastguard Worker__imod__ = imod 460*cda5da8dSAndroid Build Coastguard Worker__imul__ = imul 461*cda5da8dSAndroid Build Coastguard Worker__imatmul__ = imatmul 462*cda5da8dSAndroid Build Coastguard Worker__ior__ = ior 463*cda5da8dSAndroid Build Coastguard Worker__ipow__ = ipow 464*cda5da8dSAndroid Build Coastguard Worker__irshift__ = irshift 465*cda5da8dSAndroid Build Coastguard Worker__isub__ = isub 466*cda5da8dSAndroid Build Coastguard Worker__itruediv__ = itruediv 467*cda5da8dSAndroid Build Coastguard Worker__ixor__ = ixor 468