Skip to content

Commit d333be7

Browse files
committed
Removed Using Abstract Syntax Trees
1 parent 72383f0 commit d333be7

File tree

2 files changed

+1
-89
lines changed

2 files changed

+1
-89
lines changed

README.md

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,7 +1635,6 @@ last_el = op.methodcaller('pop')(<list>)
16351635

16361636
Eval
16371637
----
1638-
### Basic
16391638
```python
16401639
>>> from ast import literal_eval
16411640
>>> literal_eval('1 + 2')
@@ -1646,51 +1645,6 @@ Eval
16461645
ValueError: malformed node or string
16471646
```
16481647

1649-
### Using Abstract Syntax Trees
1650-
```python
1651-
import ast
1652-
from ast import Num, BinOp, UnaryOp
1653-
import operator as op
1654-
1655-
LEGAL_OPERATORS = {ast.Add: op.add, # <el> + <el>
1656-
ast.Sub: op.sub, # <el> - <el>
1657-
ast.Mult: op.mul, # <el> * <el>
1658-
ast.Div: op.truediv, # <el> / <el>
1659-
ast.Pow: op.pow, # <el> ** <el>
1660-
ast.BitXor: op.xor, # <el> ^ <el>
1661-
ast.USub: op.neg} # - <el>
1662-
1663-
def evaluate(expression):
1664-
root = ast.parse(expression, mode='eval')
1665-
return eval_node(root.body)
1666-
1667-
def eval_node(node):
1668-
node_type = type(node)
1669-
if node_type == Num:
1670-
return node.n
1671-
if node_type not in [BinOp, UnaryOp]:
1672-
raise TypeError(node)
1673-
operator_type = type(node.op)
1674-
if operator_type not in LEGAL_OPERATORS:
1675-
raise TypeError(f'Illegal operator {node.op}')
1676-
operator = LEGAL_OPERATORS[operator_type]
1677-
if node_type == BinOp:
1678-
left, right = eval_node(node.left), eval_node(node.right)
1679-
return operator(left, right)
1680-
elif node_type == UnaryOp:
1681-
operand = eval_node(node.operand)
1682-
return operator(operand)
1683-
```
1684-
1685-
```python
1686-
>>> evaluate('2 ^ 6')
1687-
4
1688-
>>> evaluate('2 ** 6')
1689-
64
1690-
>>> evaluate('1 + 2 * 3 ** (4 ^ 5) / (6 + -7)')
1691-
-5.0
1692-
```
1693-
16941648

16951649
Coroutine
16961650
---------

index.html

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,7 +1387,6 @@ <h2 id="operator"><a href="#operator" name="operator">#</a>Operator</h2>
13871387
last_el = op.methodcaller(<span class="hljs-string">'pop'</span>)(&lt;list&gt;)
13881388
</code></pre>
13891389
<h2 id="eval"><a href="#eval" name="eval">#</a>Eval</h2>
1390-
<h3 id="basic">Basic</h3>
13911390
<pre><code class="python language-python hljs"><span class="hljs-meta">&gt;&gt;&gt; </span><span class="hljs-keyword">from</span> ast <span class="hljs-keyword">import</span> literal_eval
13921391
<span class="hljs-meta">&gt;&gt;&gt; </span>literal_eval(<span class="hljs-string">'1 + 2'</span>)
13931392
<span class="hljs-number">3</span>
@@ -1396,47 +1395,6 @@ <h3 id="basic">Basic</h3>
13961395
<span class="hljs-meta">&gt;&gt;&gt; </span>literal_eval(<span class="hljs-string">'abs(1)'</span>)
13971396
ValueError: malformed node <span class="hljs-keyword">or</span> string
13981397
</code></pre>
1399-
<h3 id="usingabstractsyntaxtrees">Using Abstract Syntax Trees</h3>
1400-
<pre><code class="python language-python hljs"><span class="hljs-keyword">import</span> ast
1401-
<span class="hljs-keyword">from</span> ast <span class="hljs-keyword">import</span> Num, BinOp, UnaryOp
1402-
<span class="hljs-keyword">import</span> operator <span class="hljs-keyword">as</span> op
1403-
1404-
LEGAL_OPERATORS = {ast.Add: op.add, <span class="hljs-comment"># &lt;el&gt; + &lt;el&gt;</span>
1405-
ast.Sub: op.sub, <span class="hljs-comment"># &lt;el&gt; - &lt;el&gt;</span>
1406-
ast.Mult: op.mul, <span class="hljs-comment"># &lt;el&gt; * &lt;el&gt;</span>
1407-
ast.Div: op.truediv, <span class="hljs-comment"># &lt;el&gt; / &lt;el&gt;</span>
1408-
ast.Pow: op.pow, <span class="hljs-comment"># &lt;el&gt; ** &lt;el&gt;</span>
1409-
ast.BitXor: op.xor, <span class="hljs-comment"># &lt;el&gt; ^ &lt;el&gt;</span>
1410-
ast.USub: op.neg} <span class="hljs-comment"># - &lt;el&gt;</span>
1411-
1412-
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">evaluate</span><span class="hljs-params">(expression)</span>:</span>
1413-
root = ast.parse(expression, mode=<span class="hljs-string">'eval'</span>)
1414-
<span class="hljs-keyword">return</span> eval_node(root.body)
1415-
1416-
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">eval_node</span><span class="hljs-params">(node)</span>:</span>
1417-
node_type = type(node)
1418-
<span class="hljs-keyword">if</span> node_type == Num:
1419-
<span class="hljs-keyword">return</span> node.n
1420-
<span class="hljs-keyword">if</span> node_type <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> [BinOp, UnaryOp]:
1421-
<span class="hljs-keyword">raise</span> TypeError(node)
1422-
operator_type = type(node.op)
1423-
<span class="hljs-keyword">if</span> operator_type <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> LEGAL_OPERATORS:
1424-
<span class="hljs-keyword">raise</span> TypeError(<span class="hljs-string">f'Illegal operator <span class="hljs-subst">{node.op}</span>'</span>)
1425-
operator = LEGAL_OPERATORS[operator_type]
1426-
<span class="hljs-keyword">if</span> node_type == BinOp:
1427-
left, right = eval_node(node.left), eval_node(node.right)
1428-
<span class="hljs-keyword">return</span> operator(left, right)
1429-
<span class="hljs-keyword">elif</span> node_type == UnaryOp:
1430-
operand = eval_node(node.operand)
1431-
<span class="hljs-keyword">return</span> operator(operand)
1432-
</code></pre>
1433-
<pre><code class="python language-python hljs"><span class="hljs-meta">&gt;&gt;&gt; </span>evaluate(<span class="hljs-string">'2 ^ 6'</span>)
1434-
<span class="hljs-number">4</span>
1435-
<span class="hljs-meta">&gt;&gt;&gt; </span>evaluate(<span class="hljs-string">'2 ** 6'</span>)
1436-
<span class="hljs-number">64</span>
1437-
<span class="hljs-meta">&gt;&gt;&gt; </span>evaluate(<span class="hljs-string">'1 + 2 * 3 ** (4 ^ 5) / (6 + -7)'</span>)
1438-
<span class="hljs-number">-5.0</span>
1439-
</code></pre>
14401398
<h2 id="coroutine"><a href="#coroutine" name="coroutine">#</a>Coroutine</h2>
14411399
<ul>
14421400
<li><strong>Similar to generator, but generator pulls data through the pipe with iteration, while coroutine pushes data into the pipeline with send().</strong></li>
@@ -1626,7 +1584,7 @@ <h4 id="test">Test:</h4>
16261584
[<span class="hljs-string">'arsenal f.c.'</span>, <span class="hljs-number">2.44</span>, <span class="hljs-number">3.29</span>]
16271585
</code></pre>
16281586
<h2 id="profile"><a href="#profile" name="profile">#</a>Profile</h2>
1629-
<h3 id="basic-1">Basic</h3>
1587+
<h3 id="basic">Basic</h3>
16301588
<pre><code class="python language-python hljs"><span class="hljs-keyword">from</span> time <span class="hljs-keyword">import</span> time
16311589
start_time = time() <span class="hljs-comment"># Seconds since Epoch.</span>
16321590
...

0 commit comments

Comments
 (0)