Skip to content

Commit 98c5fea

Browse files
jbrockmendelharisbal
authored and
harisbal
committed
ops cleanup, named functions instead of lambdas (pandas-dev#19515)
1 parent c5c59fa commit 98c5fea

File tree

1 file changed

+64
-28
lines changed

1 file changed

+64
-28
lines changed

pandas/core/ops.py

+64-28
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,60 @@
4242
ABCSparseSeries, ABCSparseArray)
4343

4444

45+
# -----------------------------------------------------------------------------
46+
# Reversed Operations not available in the stdlib operator module.
47+
# Defining these instead of using lambdas allows us to reference them by name.
48+
49+
def radd(left, right):
50+
return right + left
51+
52+
53+
def rsub(left, right):
54+
return right - left
55+
56+
57+
def rmul(left, right):
58+
return right * left
59+
60+
61+
def rdiv(left, right):
62+
return right / left
63+
64+
65+
def rtruediv(left, right):
66+
return right / left
67+
68+
69+
def rfloordiv(left, right):
70+
return right // left
71+
72+
73+
def rmod(left, right):
74+
return right % left
75+
76+
77+
def rdivmod(left, right):
78+
return divmod(right, left)
79+
80+
81+
def rpow(left, right):
82+
return right ** left
83+
84+
85+
def rand_(left, right):
86+
return operator.and_(right, left)
87+
88+
89+
def ror_(left, right):
90+
return operator.or_(right, left)
91+
92+
93+
def rxor(left, right):
94+
return operator.xor(right, left)
95+
96+
97+
# -----------------------------------------------------------------------------
98+
4599
def _gen_eval_kwargs(name):
46100
"""
47101
Find the keyword arguments to pass to numexpr for the given operation.
@@ -140,64 +194,51 @@ def _get_frame_op_default_axis(name):
140194
_op_descriptions = {
141195
'add': {'op': '+',
142196
'desc': 'Addition',
143-
'reversed': False,
144197
'reverse': 'radd'},
145198
'sub': {'op': '-',
146199
'desc': 'Subtraction',
147-
'reversed': False,
148200
'reverse': 'rsub'},
149201
'mul': {'op': '*',
150202
'desc': 'Multiplication',
151-
'reversed': False,
152203
'reverse': 'rmul'},
153204
'mod': {'op': '%',
154205
'desc': 'Modulo',
155-
'reversed': False,
156206
'reverse': 'rmod'},
157207
'pow': {'op': '**',
158208
'desc': 'Exponential power',
159-
'reversed': False,
160209
'reverse': 'rpow'},
161210
'truediv': {'op': '/',
162211
'desc': 'Floating division',
163-
'reversed': False,
164212
'reverse': 'rtruediv'},
165213
'floordiv': {'op': '//',
166214
'desc': 'Integer division',
167-
'reversed': False,
168215
'reverse': 'rfloordiv'},
169216
'divmod': {'op': 'divmod',
170217
'desc': 'Integer division and modulo',
171-
'reversed': False,
172218
'reverse': None},
173219

174220
'eq': {'op': '==',
175221
'desc': 'Equal to',
176-
'reversed': False,
177222
'reverse': None},
178223
'ne': {'op': '!=',
179224
'desc': 'Not equal to',
180-
'reversed': False,
181225
'reverse': None},
182226
'lt': {'op': '<',
183227
'desc': 'Less than',
184-
'reversed': False,
185228
'reverse': None},
186229
'le': {'op': '<=',
187230
'desc': 'Less than or equal to',
188-
'reversed': False,
189231
'reverse': None},
190232
'gt': {'op': '>',
191233
'desc': 'Greater than',
192-
'reversed': False,
193234
'reverse': None},
194235
'ge': {'op': '>=',
195236
'desc': 'Greater than or equal to',
196-
'reversed': False,
197237
'reverse': None}}
198238

199239
_op_names = list(_op_descriptions.keys())
200240
for key in _op_names:
241+
_op_descriptions[key]['reversed'] = False
201242
reverse_op = _op_descriptions[key]['reverse']
202243
if reverse_op is not None:
203244
_op_descriptions[reverse_op] = _op_descriptions[key].copy()
@@ -392,7 +433,7 @@ def names(x):
392433
# yapf: disable
393434
new_methods = dict(
394435
add=arith_method(operator.add, names('add'), op('+')),
395-
radd=arith_method(lambda x, y: y + x, names('radd'), op('+')),
436+
radd=arith_method(radd, names('radd'), op('+')),
396437
sub=arith_method(operator.sub, names('sub'), op('-')),
397438
mul=arith_method(operator.mul, names('mul'), op('*')),
398439
truediv=arith_method(operator.truediv, names('truediv'), op('/')),
@@ -404,13 +445,11 @@ def names(x):
404445
# not entirely sure why this is necessary, but previously was included
405446
# so it's here to maintain compatibility
406447
rmul=arith_method(operator.mul, names('rmul'), op('*')),
407-
rsub=arith_method(lambda x, y: y - x, names('rsub'), op('-')),
408-
rtruediv=arith_method(lambda x, y: operator.truediv(y, x),
409-
names('rtruediv'), op('/')),
410-
rfloordiv=arith_method(lambda x, y: operator.floordiv(y, x),
411-
names('rfloordiv'), op('//')),
412-
rpow=arith_method(lambda x, y: y**x, names('rpow'), op('**')),
413-
rmod=arith_method(lambda x, y: y % x, names('rmod'), op('%')))
448+
rsub=arith_method(rsub, names('rsub'), op('-')),
449+
rtruediv=arith_method(rtruediv, names('rtruediv'), op('/')),
450+
rfloordiv=arith_method(rfloordiv, names('rfloordiv'), op('//')),
451+
rpow=arith_method(rpow, names('rpow'), op('**')),
452+
rmod=arith_method(rmod, names('rmod'), op('%')))
414453
# yapf: enable
415454
new_methods['div'] = new_methods['truediv']
416455
new_methods['rdiv'] = new_methods['rtruediv']
@@ -430,12 +469,9 @@ def names(x):
430469
or_=bool_method(operator.or_, names('or_'), op('|')),
431470
# For some reason ``^`` wasn't used in original.
432471
xor=bool_method(operator.xor, names('xor'), op('^')),
433-
rand_=bool_method(lambda x, y: operator.and_(y, x),
434-
names('rand_'), op('&')),
435-
ror_=bool_method(lambda x, y: operator.or_(y, x),
436-
names('ror_'), op('|')),
437-
rxor=bool_method(lambda x, y: operator.xor(y, x),
438-
names('rxor'), op('^'))))
472+
rand_=bool_method(rand_, names('rand_'), op('&')),
473+
ror_=bool_method(ror_, names('ror_'), op('|')),
474+
rxor=bool_method(rxor, names('rxor'), op('^'))))
439475
if have_divmod:
440476
# divmod doesn't have an op that is supported by numexpr
441477
new_methods['divmod'] = arith_method(divmod, names('divmod'), None)

0 commit comments

Comments
 (0)