xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/operator.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
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