33"""Top level ``eval`` module.
44"""
55
6+ import warnings
67import tokenize
78from pandas .io .formats .printing import pprint_thing
89from pandas .core .computation .scope import _ensure_scope
@@ -303,7 +304,8 @@ def eval(expr, parser='pandas', engine=None, truediv=True,
303304 "if there is no assignment" )
304305
305306 # 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 :
307309 target_modified = True
308310
309311 # if returning a copy, copy only on the first assignment
@@ -317,22 +319,25 @@ def eval(expr, parser='pandas', engine=None, truediv=True,
317319
318320 # TypeError is most commonly raised (e.g. int, list), but you
319321 # 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
320324 try :
321- target [parsed_expr .assigner ] = ret
325+ with warnings .catch_warnings (record = True ):
326+ target [assigner ] = ret
322327 except (TypeError , IndexError ):
323328 raise ValueError ("Cannot assign expression output to target" )
324329
325330 if not resolvers :
326- resolvers = ({parsed_expr . assigner : ret },)
331+ resolvers = ({assigner : ret },)
327332 else :
328333 # existing resolver needs updated to handle
329334 # case of mutating existing column in copy
330335 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
333338 break
334339 else :
335- resolvers += ({parsed_expr . assigner : ret },)
340+ resolvers += ({assigner : ret },)
336341
337342 ret = None
338343 first_expr = False
0 commit comments