3
3
"""Top level ``eval`` module.
4
4
"""
5
5
6
+ import warnings
6
7
import tokenize
7
8
from pandas .io .formats .printing import pprint_thing
8
9
from pandas .core .computation .scope import _ensure_scope
@@ -303,7 +304,8 @@ def eval(expr, parser='pandas', engine=None, truediv=True,
303
304
"if there is no assignment" )
304
305
305
306
# assign if needed
306
- if env .target is not None and parsed_expr .assigner is not None :
307
+ assigner = parsed_expr .assigner
308
+ if env .target is not None and assigner is not None :
307
309
target_modified = True
308
310
309
311
# if returning a copy, copy only on the first assignment
@@ -317,22 +319,25 @@ def eval(expr, parser='pandas', engine=None, truediv=True,
317
319
318
320
# TypeError is most commonly raised (e.g. int, list), but you
319
321
# get IndexError if you try to do this assignment on np.ndarray.
322
+ # we will ignore numpy warnings here; e.g. if trying
323
+ # to use a non-numeric indexer
320
324
try :
321
- target [parsed_expr .assigner ] = ret
325
+ with warnings .catch_warnings (record = True ):
326
+ target [assigner ] = ret
322
327
except (TypeError , IndexError ):
323
328
raise ValueError ("Cannot assign expression output to target" )
324
329
325
330
if not resolvers :
326
- resolvers = ({parsed_expr . assigner : ret },)
331
+ resolvers = ({assigner : ret },)
327
332
else :
328
333
# existing resolver needs updated to handle
329
334
# case of mutating existing column in copy
330
335
for resolver in resolvers :
331
- if parsed_expr . assigner in resolver :
332
- resolver [parsed_expr . assigner ] = ret
336
+ if assigner in resolver :
337
+ resolver [assigner ] = ret
333
338
break
334
339
else :
335
- resolvers += ({parsed_expr . assigner : ret },)
340
+ resolvers += ({assigner : ret },)
336
341
337
342
ret = None
338
343
first_expr = False
0 commit comments