Skip to content

Commit 6794d8d

Browse files
committed
New eval keyword to disallow assignment
1 parent 01995b2 commit 6794d8d

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

pandas/computation/eval.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def _check_for_locals(expr, stack_level, parser):
138138

139139
def eval(expr, parser='pandas', engine='numexpr', truediv=True,
140140
local_dict=None, global_dict=None, resolvers=(), level=0,
141-
target=None):
141+
target=None, assignment_allowed=True):
142142
"""Evaluate a Python expression as a string using various backends.
143143
144144
The following arithmetic operations are supported: ``+``, ``-``, ``*``,
@@ -196,6 +196,9 @@ def eval(expr, parser='pandas', engine='numexpr', truediv=True,
196196
scope. Most users will **not** need to change this parameter.
197197
target : a target object for assignment, optional, default is None
198198
essentially this is a passed in resolver
199+
assignment_allowed : bool
200+
Whether the eval should be able to modify the input through
201+
assigment.
199202
200203
Returns
201204
-------
@@ -236,7 +239,11 @@ def eval(expr, parser='pandas', engine='numexpr', truediv=True,
236239

237240
# assign if needed
238241
if env.target is not None and parsed_expr.assigner is not None:
239-
env.target[parsed_expr.assigner] = ret
240-
return None
242+
if assignment_allowed:
243+
env.target[parsed_expr.assigner] = ret
244+
return None
245+
else:
246+
raise ValueError("Expression includes assignment statement: \n"
247+
"\t not allowed from DataFrame.query")
241248

242249
return ret

pandas/core/frame.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1935,7 +1935,7 @@ def query(self, expr, **kwargs):
19351935
>>> df[df.a > df.b] # same result as the previous expression
19361936
"""
19371937
kwargs['level'] = kwargs.pop('level', 0) + 1
1938-
res = self.eval(expr, **kwargs)
1938+
res = self.eval(expr, assignment_allowed=False, **kwargs)
19391939

19401940
try:
19411941
return self.loc[res]

0 commit comments

Comments
 (0)