17db96d56Sopenharmony_ci"""
27db96d56Sopenharmony_ciOperator Interface
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ciThis module exports a set of functions corresponding to the intrinsic
57db96d56Sopenharmony_cioperators of Python.  For example, operator.add(x, y) is equivalent
67db96d56Sopenharmony_cito the expression x+y.  The function names are those used for special
77db96d56Sopenharmony_cimethods; variants without leading and trailing '__' are also provided
87db96d56Sopenharmony_cifor convenience.
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciThis is the pure Python implementation of the module.
117db96d56Sopenharmony_ci"""
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci__all__ = ['abs', 'add', 'and_', 'attrgetter', 'call', 'concat', 'contains', 'countOf',
147db96d56Sopenharmony_ci           'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand',
157db96d56Sopenharmony_ci           'iconcat', 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul',
167db96d56Sopenharmony_ci           'index', 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift',
177db96d56Sopenharmony_ci           'is_', 'is_not', 'isub', 'itemgetter', 'itruediv', 'ixor', 'le',
187db96d56Sopenharmony_ci           'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller', 'mod',
197db96d56Sopenharmony_ci           'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift',
207db96d56Sopenharmony_ci           'setitem', 'sub', 'truediv', 'truth', 'xor']
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_cifrom builtins import abs as _abs
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci# Comparison Operations *******************************************************#
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_cidef lt(a, b):
287db96d56Sopenharmony_ci    "Same as a < b."
297db96d56Sopenharmony_ci    return a < b
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_cidef le(a, b):
327db96d56Sopenharmony_ci    "Same as a <= b."
337db96d56Sopenharmony_ci    return a <= b
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_cidef eq(a, b):
367db96d56Sopenharmony_ci    "Same as a == b."
377db96d56Sopenharmony_ci    return a == b
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_cidef ne(a, b):
407db96d56Sopenharmony_ci    "Same as a != b."
417db96d56Sopenharmony_ci    return a != b
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_cidef ge(a, b):
447db96d56Sopenharmony_ci    "Same as a >= b."
457db96d56Sopenharmony_ci    return a >= b
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_cidef gt(a, b):
487db96d56Sopenharmony_ci    "Same as a > b."
497db96d56Sopenharmony_ci    return a > b
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci# Logical Operations **********************************************************#
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_cidef not_(a):
547db96d56Sopenharmony_ci    "Same as not a."
557db96d56Sopenharmony_ci    return not a
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_cidef truth(a):
587db96d56Sopenharmony_ci    "Return True if a is true, False otherwise."
597db96d56Sopenharmony_ci    return True if a else False
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_cidef is_(a, b):
627db96d56Sopenharmony_ci    "Same as a is b."
637db96d56Sopenharmony_ci    return a is b
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_cidef is_not(a, b):
667db96d56Sopenharmony_ci    "Same as a is not b."
677db96d56Sopenharmony_ci    return a is not b
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci# Mathematical/Bitwise Operations *********************************************#
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_cidef abs(a):
727db96d56Sopenharmony_ci    "Same as abs(a)."
737db96d56Sopenharmony_ci    return _abs(a)
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_cidef add(a, b):
767db96d56Sopenharmony_ci    "Same as a + b."
777db96d56Sopenharmony_ci    return a + b
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_cidef and_(a, b):
807db96d56Sopenharmony_ci    "Same as a & b."
817db96d56Sopenharmony_ci    return a & b
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_cidef floordiv(a, b):
847db96d56Sopenharmony_ci    "Same as a // b."
857db96d56Sopenharmony_ci    return a // b
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_cidef index(a):
887db96d56Sopenharmony_ci    "Same as a.__index__()."
897db96d56Sopenharmony_ci    return a.__index__()
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_cidef inv(a):
927db96d56Sopenharmony_ci    "Same as ~a."
937db96d56Sopenharmony_ci    return ~a
947db96d56Sopenharmony_ciinvert = inv
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_cidef lshift(a, b):
977db96d56Sopenharmony_ci    "Same as a << b."
987db96d56Sopenharmony_ci    return a << b
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_cidef mod(a, b):
1017db96d56Sopenharmony_ci    "Same as a % b."
1027db96d56Sopenharmony_ci    return a % b
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_cidef mul(a, b):
1057db96d56Sopenharmony_ci    "Same as a * b."
1067db96d56Sopenharmony_ci    return a * b
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_cidef matmul(a, b):
1097db96d56Sopenharmony_ci    "Same as a @ b."
1107db96d56Sopenharmony_ci    return a @ b
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_cidef neg(a):
1137db96d56Sopenharmony_ci    "Same as -a."
1147db96d56Sopenharmony_ci    return -a
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_cidef or_(a, b):
1177db96d56Sopenharmony_ci    "Same as a | b."
1187db96d56Sopenharmony_ci    return a | b
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_cidef pos(a):
1217db96d56Sopenharmony_ci    "Same as +a."
1227db96d56Sopenharmony_ci    return +a
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_cidef pow(a, b):
1257db96d56Sopenharmony_ci    "Same as a ** b."
1267db96d56Sopenharmony_ci    return a ** b
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_cidef rshift(a, b):
1297db96d56Sopenharmony_ci    "Same as a >> b."
1307db96d56Sopenharmony_ci    return a >> b
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_cidef sub(a, b):
1337db96d56Sopenharmony_ci    "Same as a - b."
1347db96d56Sopenharmony_ci    return a - b
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_cidef truediv(a, b):
1377db96d56Sopenharmony_ci    "Same as a / b."
1387db96d56Sopenharmony_ci    return a / b
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_cidef xor(a, b):
1417db96d56Sopenharmony_ci    "Same as a ^ b."
1427db96d56Sopenharmony_ci    return a ^ b
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci# Sequence Operations *********************************************************#
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_cidef concat(a, b):
1477db96d56Sopenharmony_ci    "Same as a + b, for a and b sequences."
1487db96d56Sopenharmony_ci    if not hasattr(a, '__getitem__'):
1497db96d56Sopenharmony_ci        msg = "'%s' object can't be concatenated" % type(a).__name__
1507db96d56Sopenharmony_ci        raise TypeError(msg)
1517db96d56Sopenharmony_ci    return a + b
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_cidef contains(a, b):
1547db96d56Sopenharmony_ci    "Same as b in a (note reversed operands)."
1557db96d56Sopenharmony_ci    return b in a
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_cidef countOf(a, b):
1587db96d56Sopenharmony_ci    "Return the number of items in a which are, or which equal, b."
1597db96d56Sopenharmony_ci    count = 0
1607db96d56Sopenharmony_ci    for i in a:
1617db96d56Sopenharmony_ci        if i is b or i == b:
1627db96d56Sopenharmony_ci            count += 1
1637db96d56Sopenharmony_ci    return count
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_cidef delitem(a, b):
1667db96d56Sopenharmony_ci    "Same as del a[b]."
1677db96d56Sopenharmony_ci    del a[b]
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_cidef getitem(a, b):
1707db96d56Sopenharmony_ci    "Same as a[b]."
1717db96d56Sopenharmony_ci    return a[b]
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_cidef indexOf(a, b):
1747db96d56Sopenharmony_ci    "Return the first index of b in a."
1757db96d56Sopenharmony_ci    for i, j in enumerate(a):
1767db96d56Sopenharmony_ci        if j is b or j == b:
1777db96d56Sopenharmony_ci            return i
1787db96d56Sopenharmony_ci    else:
1797db96d56Sopenharmony_ci        raise ValueError('sequence.index(x): x not in sequence')
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_cidef setitem(a, b, c):
1827db96d56Sopenharmony_ci    "Same as a[b] = c."
1837db96d56Sopenharmony_ci    a[b] = c
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_cidef length_hint(obj, default=0):
1867db96d56Sopenharmony_ci    """
1877db96d56Sopenharmony_ci    Return an estimate of the number of items in obj.
1887db96d56Sopenharmony_ci    This is useful for presizing containers when building from an iterable.
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci    If the object supports len(), the result will be exact. Otherwise, it may
1917db96d56Sopenharmony_ci    over- or under-estimate by an arbitrary amount. The result will be an
1927db96d56Sopenharmony_ci    integer >= 0.
1937db96d56Sopenharmony_ci    """
1947db96d56Sopenharmony_ci    if not isinstance(default, int):
1957db96d56Sopenharmony_ci        msg = ("'%s' object cannot be interpreted as an integer" %
1967db96d56Sopenharmony_ci               type(default).__name__)
1977db96d56Sopenharmony_ci        raise TypeError(msg)
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci    try:
2007db96d56Sopenharmony_ci        return len(obj)
2017db96d56Sopenharmony_ci    except TypeError:
2027db96d56Sopenharmony_ci        pass
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci    try:
2057db96d56Sopenharmony_ci        hint = type(obj).__length_hint__
2067db96d56Sopenharmony_ci    except AttributeError:
2077db96d56Sopenharmony_ci        return default
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci    try:
2107db96d56Sopenharmony_ci        val = hint(obj)
2117db96d56Sopenharmony_ci    except TypeError:
2127db96d56Sopenharmony_ci        return default
2137db96d56Sopenharmony_ci    if val is NotImplemented:
2147db96d56Sopenharmony_ci        return default
2157db96d56Sopenharmony_ci    if not isinstance(val, int):
2167db96d56Sopenharmony_ci        msg = ('__length_hint__ must be integer, not %s' %
2177db96d56Sopenharmony_ci               type(val).__name__)
2187db96d56Sopenharmony_ci        raise TypeError(msg)
2197db96d56Sopenharmony_ci    if val < 0:
2207db96d56Sopenharmony_ci        msg = '__length_hint__() should return >= 0'
2217db96d56Sopenharmony_ci        raise ValueError(msg)
2227db96d56Sopenharmony_ci    return val
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci# Other Operations ************************************************************#
2257db96d56Sopenharmony_ci
2267db96d56Sopenharmony_cidef call(obj, /, *args, **kwargs):
2277db96d56Sopenharmony_ci    """Same as obj(*args, **kwargs)."""
2287db96d56Sopenharmony_ci    return obj(*args, **kwargs)
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci# Generalized Lookup Objects **************************************************#
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ciclass attrgetter:
2337db96d56Sopenharmony_ci    """
2347db96d56Sopenharmony_ci    Return a callable object that fetches the given attribute(s) from its operand.
2357db96d56Sopenharmony_ci    After f = attrgetter('name'), the call f(r) returns r.name.
2367db96d56Sopenharmony_ci    After g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date).
2377db96d56Sopenharmony_ci    After h = attrgetter('name.first', 'name.last'), the call h(r) returns
2387db96d56Sopenharmony_ci    (r.name.first, r.name.last).
2397db96d56Sopenharmony_ci    """
2407db96d56Sopenharmony_ci    __slots__ = ('_attrs', '_call')
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci    def __init__(self, attr, *attrs):
2437db96d56Sopenharmony_ci        if not attrs:
2447db96d56Sopenharmony_ci            if not isinstance(attr, str):
2457db96d56Sopenharmony_ci                raise TypeError('attribute name must be a string')
2467db96d56Sopenharmony_ci            self._attrs = (attr,)
2477db96d56Sopenharmony_ci            names = attr.split('.')
2487db96d56Sopenharmony_ci            def func(obj):
2497db96d56Sopenharmony_ci                for name in names:
2507db96d56Sopenharmony_ci                    obj = getattr(obj, name)
2517db96d56Sopenharmony_ci                return obj
2527db96d56Sopenharmony_ci            self._call = func
2537db96d56Sopenharmony_ci        else:
2547db96d56Sopenharmony_ci            self._attrs = (attr,) + attrs
2557db96d56Sopenharmony_ci            getters = tuple(map(attrgetter, self._attrs))
2567db96d56Sopenharmony_ci            def func(obj):
2577db96d56Sopenharmony_ci                return tuple(getter(obj) for getter in getters)
2587db96d56Sopenharmony_ci            self._call = func
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci    def __call__(self, obj):
2617db96d56Sopenharmony_ci        return self._call(obj)
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci    def __repr__(self):
2647db96d56Sopenharmony_ci        return '%s.%s(%s)' % (self.__class__.__module__,
2657db96d56Sopenharmony_ci                              self.__class__.__qualname__,
2667db96d56Sopenharmony_ci                              ', '.join(map(repr, self._attrs)))
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci    def __reduce__(self):
2697db96d56Sopenharmony_ci        return self.__class__, self._attrs
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ciclass itemgetter:
2727db96d56Sopenharmony_ci    """
2737db96d56Sopenharmony_ci    Return a callable object that fetches the given item(s) from its operand.
2747db96d56Sopenharmony_ci    After f = itemgetter(2), the call f(r) returns r[2].
2757db96d56Sopenharmony_ci    After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])
2767db96d56Sopenharmony_ci    """
2777db96d56Sopenharmony_ci    __slots__ = ('_items', '_call')
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci    def __init__(self, item, *items):
2807db96d56Sopenharmony_ci        if not items:
2817db96d56Sopenharmony_ci            self._items = (item,)
2827db96d56Sopenharmony_ci            def func(obj):
2837db96d56Sopenharmony_ci                return obj[item]
2847db96d56Sopenharmony_ci            self._call = func
2857db96d56Sopenharmony_ci        else:
2867db96d56Sopenharmony_ci            self._items = items = (item,) + items
2877db96d56Sopenharmony_ci            def func(obj):
2887db96d56Sopenharmony_ci                return tuple(obj[i] for i in items)
2897db96d56Sopenharmony_ci            self._call = func
2907db96d56Sopenharmony_ci
2917db96d56Sopenharmony_ci    def __call__(self, obj):
2927db96d56Sopenharmony_ci        return self._call(obj)
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci    def __repr__(self):
2957db96d56Sopenharmony_ci        return '%s.%s(%s)' % (self.__class__.__module__,
2967db96d56Sopenharmony_ci                              self.__class__.__name__,
2977db96d56Sopenharmony_ci                              ', '.join(map(repr, self._items)))
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci    def __reduce__(self):
3007db96d56Sopenharmony_ci        return self.__class__, self._items
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ciclass methodcaller:
3037db96d56Sopenharmony_ci    """
3047db96d56Sopenharmony_ci    Return a callable object that calls the given method on its operand.
3057db96d56Sopenharmony_ci    After f = methodcaller('name'), the call f(r) returns r.name().
3067db96d56Sopenharmony_ci    After g = methodcaller('name', 'date', foo=1), the call g(r) returns
3077db96d56Sopenharmony_ci    r.name('date', foo=1).
3087db96d56Sopenharmony_ci    """
3097db96d56Sopenharmony_ci    __slots__ = ('_name', '_args', '_kwargs')
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci    def __init__(self, name, /, *args, **kwargs):
3127db96d56Sopenharmony_ci        self._name = name
3137db96d56Sopenharmony_ci        if not isinstance(self._name, str):
3147db96d56Sopenharmony_ci            raise TypeError('method name must be a string')
3157db96d56Sopenharmony_ci        self._args = args
3167db96d56Sopenharmony_ci        self._kwargs = kwargs
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_ci    def __call__(self, obj):
3197db96d56Sopenharmony_ci        return getattr(obj, self._name)(*self._args, **self._kwargs)
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci    def __repr__(self):
3227db96d56Sopenharmony_ci        args = [repr(self._name)]
3237db96d56Sopenharmony_ci        args.extend(map(repr, self._args))
3247db96d56Sopenharmony_ci        args.extend('%s=%r' % (k, v) for k, v in self._kwargs.items())
3257db96d56Sopenharmony_ci        return '%s.%s(%s)' % (self.__class__.__module__,
3267db96d56Sopenharmony_ci                              self.__class__.__name__,
3277db96d56Sopenharmony_ci                              ', '.join(args))
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci    def __reduce__(self):
3307db96d56Sopenharmony_ci        if not self._kwargs:
3317db96d56Sopenharmony_ci            return self.__class__, (self._name,) + self._args
3327db96d56Sopenharmony_ci        else:
3337db96d56Sopenharmony_ci            from functools import partial
3347db96d56Sopenharmony_ci            return partial(self.__class__, self._name, **self._kwargs), self._args
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci# In-place Operations *********************************************************#
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_cidef iadd(a, b):
3407db96d56Sopenharmony_ci    "Same as a += b."
3417db96d56Sopenharmony_ci    a += b
3427db96d56Sopenharmony_ci    return a
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_cidef iand(a, b):
3457db96d56Sopenharmony_ci    "Same as a &= b."
3467db96d56Sopenharmony_ci    a &= b
3477db96d56Sopenharmony_ci    return a
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_cidef iconcat(a, b):
3507db96d56Sopenharmony_ci    "Same as a += b, for a and b sequences."
3517db96d56Sopenharmony_ci    if not hasattr(a, '__getitem__'):
3527db96d56Sopenharmony_ci        msg = "'%s' object can't be concatenated" % type(a).__name__
3537db96d56Sopenharmony_ci        raise TypeError(msg)
3547db96d56Sopenharmony_ci    a += b
3557db96d56Sopenharmony_ci    return a
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_cidef ifloordiv(a, b):
3587db96d56Sopenharmony_ci    "Same as a //= b."
3597db96d56Sopenharmony_ci    a //= b
3607db96d56Sopenharmony_ci    return a
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_cidef ilshift(a, b):
3637db96d56Sopenharmony_ci    "Same as a <<= b."
3647db96d56Sopenharmony_ci    a <<= b
3657db96d56Sopenharmony_ci    return a
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_cidef imod(a, b):
3687db96d56Sopenharmony_ci    "Same as a %= b."
3697db96d56Sopenharmony_ci    a %= b
3707db96d56Sopenharmony_ci    return a
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_cidef imul(a, b):
3737db96d56Sopenharmony_ci    "Same as a *= b."
3747db96d56Sopenharmony_ci    a *= b
3757db96d56Sopenharmony_ci    return a
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_cidef imatmul(a, b):
3787db96d56Sopenharmony_ci    "Same as a @= b."
3797db96d56Sopenharmony_ci    a @= b
3807db96d56Sopenharmony_ci    return a
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_cidef ior(a, b):
3837db96d56Sopenharmony_ci    "Same as a |= b."
3847db96d56Sopenharmony_ci    a |= b
3857db96d56Sopenharmony_ci    return a
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_cidef ipow(a, b):
3887db96d56Sopenharmony_ci    "Same as a **= b."
3897db96d56Sopenharmony_ci    a **=b
3907db96d56Sopenharmony_ci    return a
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_cidef irshift(a, b):
3937db96d56Sopenharmony_ci    "Same as a >>= b."
3947db96d56Sopenharmony_ci    a >>= b
3957db96d56Sopenharmony_ci    return a
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_cidef isub(a, b):
3987db96d56Sopenharmony_ci    "Same as a -= b."
3997db96d56Sopenharmony_ci    a -= b
4007db96d56Sopenharmony_ci    return a
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_cidef itruediv(a, b):
4037db96d56Sopenharmony_ci    "Same as a /= b."
4047db96d56Sopenharmony_ci    a /= b
4057db96d56Sopenharmony_ci    return a
4067db96d56Sopenharmony_ci
4077db96d56Sopenharmony_cidef ixor(a, b):
4087db96d56Sopenharmony_ci    "Same as a ^= b."
4097db96d56Sopenharmony_ci    a ^= b
4107db96d56Sopenharmony_ci    return a
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_citry:
4147db96d56Sopenharmony_ci    from _operator import *
4157db96d56Sopenharmony_ciexcept ImportError:
4167db96d56Sopenharmony_ci    pass
4177db96d56Sopenharmony_cielse:
4187db96d56Sopenharmony_ci    from _operator import __doc__
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ci# All of these "__func__ = func" assignments have to happen after importing
4217db96d56Sopenharmony_ci# from _operator to make sure they're set to the right function
4227db96d56Sopenharmony_ci__lt__ = lt
4237db96d56Sopenharmony_ci__le__ = le
4247db96d56Sopenharmony_ci__eq__ = eq
4257db96d56Sopenharmony_ci__ne__ = ne
4267db96d56Sopenharmony_ci__ge__ = ge
4277db96d56Sopenharmony_ci__gt__ = gt
4287db96d56Sopenharmony_ci__not__ = not_
4297db96d56Sopenharmony_ci__abs__ = abs
4307db96d56Sopenharmony_ci__add__ = add
4317db96d56Sopenharmony_ci__and__ = and_
4327db96d56Sopenharmony_ci__call__ = call
4337db96d56Sopenharmony_ci__floordiv__ = floordiv
4347db96d56Sopenharmony_ci__index__ = index
4357db96d56Sopenharmony_ci__inv__ = inv
4367db96d56Sopenharmony_ci__invert__ = invert
4377db96d56Sopenharmony_ci__lshift__ = lshift
4387db96d56Sopenharmony_ci__mod__ = mod
4397db96d56Sopenharmony_ci__mul__ = mul
4407db96d56Sopenharmony_ci__matmul__ = matmul
4417db96d56Sopenharmony_ci__neg__ = neg
4427db96d56Sopenharmony_ci__or__ = or_
4437db96d56Sopenharmony_ci__pos__ = pos
4447db96d56Sopenharmony_ci__pow__ = pow
4457db96d56Sopenharmony_ci__rshift__ = rshift
4467db96d56Sopenharmony_ci__sub__ = sub
4477db96d56Sopenharmony_ci__truediv__ = truediv
4487db96d56Sopenharmony_ci__xor__ = xor
4497db96d56Sopenharmony_ci__concat__ = concat
4507db96d56Sopenharmony_ci__contains__ = contains
4517db96d56Sopenharmony_ci__delitem__ = delitem
4527db96d56Sopenharmony_ci__getitem__ = getitem
4537db96d56Sopenharmony_ci__setitem__ = setitem
4547db96d56Sopenharmony_ci__iadd__ = iadd
4557db96d56Sopenharmony_ci__iand__ = iand
4567db96d56Sopenharmony_ci__iconcat__ = iconcat
4577db96d56Sopenharmony_ci__ifloordiv__ = ifloordiv
4587db96d56Sopenharmony_ci__ilshift__ = ilshift
4597db96d56Sopenharmony_ci__imod__ = imod
4607db96d56Sopenharmony_ci__imul__ = imul
4617db96d56Sopenharmony_ci__imatmul__ = imatmul
4627db96d56Sopenharmony_ci__ior__ = ior
4637db96d56Sopenharmony_ci__ipow__ = ipow
4647db96d56Sopenharmony_ci__irshift__ = irshift
4657db96d56Sopenharmony_ci__isub__ = isub
4667db96d56Sopenharmony_ci__itruediv__ = itruediv
4677db96d56Sopenharmony_ci__ixor__ = ixor
468