Skip to content

Commit 9a86055

Browse files
committed
Eval
1 parent 41b7c4c commit 9a86055

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

README.md

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,10 +1008,9 @@ Eval
10081008
### Detailed
10091009
```python
10101010
import ast
1011-
from ast import Num, BinOp, UnaryOp
1011+
from ast import Num, BinOp, UnaryOp, parse
10121012
import operator as op
10131013

1014-
# Supported operators
10151014
operators = {ast.Add: op.add,
10161015
ast.Sub: op.sub,
10171016
ast.Mult: op.mul,
@@ -1020,18 +1019,23 @@ operators = {ast.Add: op.add,
10201019
ast.BitXor: op.xor,
10211020
ast.USub: op.neg}
10221021

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)
10251025

10261026
def eval_node(node):
1027-
if isinstance(node, Num): # <number>
1027+
type_ = type(node)
1028+
if type_ == Num:
10281029
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]:
10341031
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)
10351039
```
10361040

10371041
```python

0 commit comments

Comments
 (0)