@@ -1008,10 +1008,9 @@ Eval
1008
1008
### Detailed
1009
1009
``` python
1010
1010
import ast
1011
- from ast import Num, BinOp, UnaryOp
1011
+ from ast import Num, BinOp, UnaryOp, parse
1012
1012
import operator as op
1013
1013
1014
- # Supported operators
1015
1014
operators = {ast.Add: op.add,
1016
1015
ast.Sub: op.sub,
1017
1016
ast.Mult: op.mul,
@@ -1020,18 +1019,23 @@ operators = {ast.Add: op.add,
1020
1019
ast.BitXor: op.xor,
1021
1020
ast.USub: op.neg}
1022
1021
1023
- def evaluate (expr ):
1024
- return eval_node(ast.parse(expr, mode = ' eval' ).body)
1022
+ def evaluate (expression ):
1023
+ root = parse(expression, mode = ' eval' )
1024
+ return eval_node(root.body)
1025
1025
1026
1026
def eval_node (node ):
1027
- if isinstance (node, Num): # <number>
1027
+ type_ = type (node)
1028
+ if type_ == Num:
1028
1029
return node.n
1029
- elif isinstance (node, BinOp): # <left> <operator> <right>
1030
- return operators[type (node.op)](eval_node(node.left), eval_node(node.right))
1031
- elif isinstance (node, UnaryOp): # <operator> <operand> e.g., -1
1032
- return operators[type (node.op)](eval_node(node.operand))
1033
- else :
1030
+ if type_ not in [BinOp, UnaryOp]:
1034
1031
raise TypeError (node)
1032
+ operator = operators[type (node.op)]
1033
+ if type_ == BinOp:
1034
+ left, right = eval_node(node.left), eval_node(node.right)
1035
+ return operator(left, right)
1036
+ elif type_ == UnaryOp:
1037
+ operand = eval_node(node.operand)
1038
+ return operator(operand)
1035
1039
```
1036
1040
1037
1041
``` python
0 commit comments