Skip to content

Commit 914451a

Browse files
add match and dataclasses
1 parent 9b780ff commit 914451a

File tree

4 files changed

+367
-10
lines changed

4 files changed

+367
-10
lines changed

Chapter1/python_new_features.ipynb

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,139 @@
216216
"get_youngest_pet(pet_info2)"
217217
]
218218
},
219+
{
220+
"cell_type": "markdown",
221+
"id": "e8a5659d",
222+
"metadata": {},
223+
"source": [
224+
"### Enhance Code Readability with Python Dataclasses and Match Statements"
225+
]
226+
},
227+
{
228+
"cell_type": "markdown",
229+
"id": "bb667ea2",
230+
"metadata": {},
231+
"source": [
232+
"You can use Python dataclasses with Python match statements to create cleaner and more readable code. This approach can be particularly useful when setting conditions based on multiple attributes of a class, as it can simplify the code and make it easier to understand.\n"
233+
]
234+
},
235+
{
236+
"cell_type": "markdown",
237+
"id": "50fdca57",
238+
"metadata": {},
239+
"source": [
240+
"Using if-else:"
241+
]
242+
},
243+
{
244+
"cell_type": "code",
245+
"execution_count": 11,
246+
"id": "d2fb488f",
247+
"metadata": {},
248+
"outputs": [],
249+
"source": [
250+
"from dataclasses import dataclass\n",
251+
"\n",
252+
"@dataclass\n",
253+
"class SubscriptionPlan:\n",
254+
" name: str\n",
255+
" price: float\n",
256+
" unit: str\n",
257+
"\n",
258+
"def get_plan_details(plan):\n",
259+
" if plan.name == \"basic\" and plan.unit == \"month\":\n",
260+
" return f\"${plan.price} per month for one month.\"\n",
261+
" elif plan.name == \"premium\" and plan.unit == \"year\":\n",
262+
" return f\"${plan.price} per year for one year.\"\n",
263+
" elif plan.name == \"\" and plan.price == 0.0 and plan.unit == \"\":\n",
264+
" return \"Invalid subscription plan\"\n",
265+
" else:\n",
266+
" return \"Unknown subscription plan\""
267+
]
268+
},
269+
{
270+
"cell_type": "code",
271+
"execution_count": 12,
272+
"id": "17c803ab",
273+
"metadata": {},
274+
"outputs": [
275+
{
276+
"name": "stdout",
277+
"output_type": "stream",
278+
"text": [
279+
"$9.99 per month for one month.\n",
280+
"$99.99 per year for one year.\n"
281+
]
282+
}
283+
],
284+
"source": [
285+
"basic_plan = SubscriptionPlan(name=\"basic\", price=9.99, unit=\"month\")\n",
286+
"premium_plan = SubscriptionPlan(name=\"premium\", price=99.99, unit=\"year\")\n",
287+
"\n",
288+
"print(get_plan_details(basic_plan))\n",
289+
"print(get_plan_details(premium_plan))"
290+
]
291+
},
292+
{
293+
"cell_type": "markdown",
294+
"id": "dc8ea2bc",
295+
"metadata": {},
296+
"source": [
297+
"Using match statements:"
298+
]
299+
},
300+
{
301+
"cell_type": "code",
302+
"execution_count": 13,
303+
"id": "59735bbe",
304+
"metadata": {},
305+
"outputs": [],
306+
"source": [
307+
"from dataclasses import dataclass\n",
308+
"\n",
309+
"\n",
310+
"@dataclass\n",
311+
"class SubscriptionPlan:\n",
312+
" name: str\n",
313+
" price: float\n",
314+
" unit: str\n",
315+
"\n",
316+
"\n",
317+
"def get_plan_details(plan):\n",
318+
" match plan:\n",
319+
" case SubscriptionPlan(name=\"basic\", price=price, unit=\"month\"):\n",
320+
" return f\"${price} per month for one month.\"\n",
321+
" case SubscriptionPlan(name=\"premium\", price=price, unit=\"year\"):\n",
322+
" return f\"${price} per year for one year.\"\n",
323+
" case SubscriptionPlan():\n",
324+
" return \"Invalid subscription plan\"\n",
325+
" case _:\n",
326+
" return \"Unknown subscription plan\""
327+
]
328+
},
329+
{
330+
"cell_type": "code",
331+
"execution_count": 14,
332+
"id": "935bd68b",
333+
"metadata": {},
334+
"outputs": [
335+
{
336+
"name": "stdout",
337+
"output_type": "stream",
338+
"text": [
339+
"$9.99 per month for one month.\n",
340+
"$99.99 per year for one year.\n"
341+
]
342+
}
343+
],
344+
"source": [
345+
"basic_plan = SubscriptionPlan(name=\"basic\", price=9.99, unit=\"month\")\n",
346+
"premium_plan = SubscriptionPlan(name=\"premium\", price=99.99, unit=\"year\")\n",
347+
"\n",
348+
"print(get_plan_details(basic_plan))\n",
349+
"print(get_plan_details(premium_plan))"
350+
]
351+
},
219352
{
220353
"attachments": {},
221354
"cell_type": "markdown",

docs/Chapter1/python_new_features.html

Lines changed: 100 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -514,9 +514,10 @@ <h2> Contents </h2>
514514
<ul class="visible nav section-nav flex-column">
515515
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#simplify-conditional-execution-with-match-statements">2.10.1. Simplify Conditional Execution with Match Statements</a></li>
516516
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#structural-pattern-matching-in-python-3-10">2.10.2. Structural Pattern Matching in Python 3.10</a></li>
517-
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#write-union-types-as-x-y-in-python-3-10">2.10.3. Write Union Types as X|Y in Python 3.10</a></li>
518-
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#walrus-operator-assign-a-variable-in-an-expression">2.10.4. Walrus Operator: Assign a Variable in an Expression</a></li>
519-
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#fine-grained-traceback-in-python-3-11">2.10.5. Fine-Grained Traceback in Python 3.11</a></li>
517+
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#enhance-code-readability-with-python-dataclasses-and-match-statements">2.10.3. Enhance Code Readability with Python Dataclasses and Match Statements</a></li>
518+
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#write-union-types-as-x-y-in-python-3-10">2.10.4. Write Union Types as X|Y in Python 3.10</a></li>
519+
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#walrus-operator-assign-a-variable-in-an-expression">2.10.5. Walrus Operator: Assign a Variable in an Expression</a></li>
520+
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#fine-grained-traceback-in-python-3-11">2.10.6. Fine-Grained Traceback in Python 3.11</a></li>
520521
</ul>
521522
</nav>
522523
</div>
@@ -638,8 +639,97 @@ <h2><span class="section-number">2.10.2. </span>Structural Pattern Matching in P
638639
</div>
639640
</div>
640641
</section>
642+
<section id="enhance-code-readability-with-python-dataclasses-and-match-statements">
643+
<h2><span class="section-number">2.10.3. </span>Enhance Code Readability with Python Dataclasses and Match Statements<a class="headerlink" href="#enhance-code-readability-with-python-dataclasses-and-match-statements" title="Permalink to this heading">#</a></h2>
644+
<p>You can use Python dataclasses with Python match statements to create cleaner and more readable code. This approach can be particularly useful when setting conditions based on multiple attributes of a class, as it can simplify the code and make it easier to understand.</p>
645+
<p>Using if-else:</p>
646+
<div class="cell docutils container">
647+
<div class="cell_input docutils container">
648+
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span>
649+
650+
<span class="nd">@dataclass</span>
651+
<span class="k">class</span> <span class="nc">SubscriptionPlan</span><span class="p">:</span>
652+
<span class="n">name</span><span class="p">:</span> <span class="nb">str</span>
653+
<span class="n">price</span><span class="p">:</span> <span class="nb">float</span>
654+
<span class="n">unit</span><span class="p">:</span> <span class="nb">str</span>
655+
656+
<span class="k">def</span> <span class="nf">get_plan_details</span><span class="p">(</span><span class="n">plan</span><span class="p">):</span>
657+
<span class="k">if</span> <span class="n">plan</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;basic&quot;</span> <span class="ow">and</span> <span class="n">plan</span><span class="o">.</span><span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;month&quot;</span><span class="p">:</span>
658+
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;$</span><span class="si">{</span><span class="n">plan</span><span class="o">.</span><span class="n">price</span><span class="si">}</span><span class="s2"> per month for one month.&quot;</span>
659+
<span class="k">elif</span> <span class="n">plan</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;premium&quot;</span> <span class="ow">and</span> <span class="n">plan</span><span class="o">.</span><span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;year&quot;</span><span class="p">:</span>
660+
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;$</span><span class="si">{</span><span class="n">plan</span><span class="o">.</span><span class="n">price</span><span class="si">}</span><span class="s2"> per year for one year.&quot;</span>
661+
<span class="k">elif</span> <span class="n">plan</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="ow">and</span> <span class="n">plan</span><span class="o">.</span><span class="n">price</span> <span class="o">==</span> <span class="mf">0.0</span> <span class="ow">and</span> <span class="n">plan</span><span class="o">.</span><span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
662+
<span class="k">return</span> <span class="s2">&quot;Invalid subscription plan&quot;</span>
663+
<span class="k">else</span><span class="p">:</span>
664+
<span class="k">return</span> <span class="s2">&quot;Unknown subscription plan&quot;</span>
665+
</pre></div>
666+
</div>
667+
</div>
668+
</div>
669+
<div class="cell docutils container">
670+
<div class="cell_input docutils container">
671+
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">basic_plan</span> <span class="o">=</span> <span class="n">SubscriptionPlan</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&quot;basic&quot;</span><span class="p">,</span> <span class="n">price</span><span class="o">=</span><span class="mf">9.99</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="s2">&quot;month&quot;</span><span class="p">)</span>
672+
<span class="n">premium_plan</span> <span class="o">=</span> <span class="n">SubscriptionPlan</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&quot;premium&quot;</span><span class="p">,</span> <span class="n">price</span><span class="o">=</span><span class="mf">99.99</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="s2">&quot;year&quot;</span><span class="p">)</span>
673+
674+
<span class="nb">print</span><span class="p">(</span><span class="n">get_plan_details</span><span class="p">(</span><span class="n">basic_plan</span><span class="p">))</span>
675+
<span class="nb">print</span><span class="p">(</span><span class="n">get_plan_details</span><span class="p">(</span><span class="n">premium_plan</span><span class="p">))</span>
676+
</pre></div>
677+
</div>
678+
</div>
679+
<div class="cell_output docutils container">
680+
<div class="output stream highlight-myst-ansi notranslate"><div class="highlight"><pre><span></span>$9.99 per month for one month.
681+
$99.99 per year for one year.
682+
</pre></div>
683+
</div>
684+
</div>
685+
</div>
686+
<p>Using match statements:</p>
687+
<div class="cell docutils container">
688+
<div class="cell_input docutils container">
689+
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span>
690+
691+
692+
<span class="nd">@dataclass</span>
693+
<span class="k">class</span> <span class="nc">SubscriptionPlan</span><span class="p">:</span>
694+
<span class="n">name</span><span class="p">:</span> <span class="nb">str</span>
695+
<span class="n">price</span><span class="p">:</span> <span class="nb">float</span>
696+
<span class="n">unit</span><span class="p">:</span> <span class="nb">str</span>
697+
698+
699+
<span class="k">def</span> <span class="nf">get_plan_details</span><span class="p">(</span><span class="n">plan</span><span class="p">):</span>
700+
<span class="k">match</span> <span class="n">plan</span><span class="p">:</span>
701+
<span class="k">case</span> <span class="n">SubscriptionPlan</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&quot;basic&quot;</span><span class="p">,</span> <span class="n">price</span><span class="o">=</span><span class="n">price</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="s2">&quot;month&quot;</span><span class="p">):</span>
702+
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;$</span><span class="si">{</span><span class="n">price</span><span class="si">}</span><span class="s2"> per month for one month.&quot;</span>
703+
<span class="k">case</span> <span class="n">SubscriptionPlan</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&quot;premium&quot;</span><span class="p">,</span> <span class="n">price</span><span class="o">=</span><span class="n">price</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="s2">&quot;year&quot;</span><span class="p">):</span>
704+
<span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;$</span><span class="si">{</span><span class="n">price</span><span class="si">}</span><span class="s2"> per year for one year.&quot;</span>
705+
<span class="k">case</span> <span class="n">SubscriptionPlan</span><span class="p">():</span>
706+
<span class="k">return</span> <span class="s2">&quot;Invalid subscription plan&quot;</span>
707+
<span class="k">case</span><span class="w"> </span><span class="k">_</span><span class="p">:</span>
708+
<span class="k">return</span> <span class="s2">&quot;Unknown subscription plan&quot;</span>
709+
</pre></div>
710+
</div>
711+
</div>
712+
</div>
713+
<div class="cell docutils container">
714+
<div class="cell_input docutils container">
715+
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">basic_plan</span> <span class="o">=</span> <span class="n">SubscriptionPlan</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&quot;basic&quot;</span><span class="p">,</span> <span class="n">price</span><span class="o">=</span><span class="mf">9.99</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="s2">&quot;month&quot;</span><span class="p">)</span>
716+
<span class="n">premium_plan</span> <span class="o">=</span> <span class="n">SubscriptionPlan</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">&quot;premium&quot;</span><span class="p">,</span> <span class="n">price</span><span class="o">=</span><span class="mf">99.99</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="s2">&quot;year&quot;</span><span class="p">)</span>
717+
718+
<span class="nb">print</span><span class="p">(</span><span class="n">get_plan_details</span><span class="p">(</span><span class="n">basic_plan</span><span class="p">))</span>
719+
<span class="nb">print</span><span class="p">(</span><span class="n">get_plan_details</span><span class="p">(</span><span class="n">premium_plan</span><span class="p">))</span>
720+
</pre></div>
721+
</div>
722+
</div>
723+
<div class="cell_output docutils container">
724+
<div class="output stream highlight-myst-ansi notranslate"><div class="highlight"><pre><span></span>$9.99 per month for one month.
725+
$99.99 per year for one year.
726+
</pre></div>
727+
</div>
728+
</div>
729+
</div>
730+
</section>
641731
<section id="write-union-types-as-x-y-in-python-3-10">
642-
<h2><span class="section-number">2.10.3. </span>Write Union Types as X|Y in Python 3.10<a class="headerlink" href="#write-union-types-as-x-y-in-python-3-10" title="Permalink to this heading">#</a></h2>
732+
<h2><span class="section-number">2.10.4. </span>Write Union Types as X|Y in Python 3.10<a class="headerlink" href="#write-union-types-as-x-y-in-python-3-10" title="Permalink to this heading">#</a></h2>
643733
<p>Before Python 3.10, you need to use <code class="docutils literal notranslate"><span class="pre">typing.Union</span></code> to declare that a variable can have one of several different types.</p>
644734
<div class="cell docutils container">
645735
<div class="cell_input docutils container">
@@ -671,7 +761,7 @@ <h2><span class="section-number">2.10.3. </span>Write Union Types as X|Y in Pyth
671761
</div>
672762
</section>
673763
<section id="walrus-operator-assign-a-variable-in-an-expression">
674-
<h2><span class="section-number">2.10.4. </span>Walrus Operator: Assign a Variable in an Expression<a class="headerlink" href="#walrus-operator-assign-a-variable-in-an-expression" title="Permalink to this heading">#</a></h2>
764+
<h2><span class="section-number">2.10.5. </span>Walrus Operator: Assign a Variable in an Expression<a class="headerlink" href="#walrus-operator-assign-a-variable-in-an-expression" title="Permalink to this heading">#</a></h2>
675765
<p>The walrus operator (<code class="docutils literal notranslate"><span class="pre">:=</span></code>) in Python 3.8 and above allows you to assign a variable in an expression. The walrus operator is useful when you want to:</p>
676766
<ul class="simple">
677767
<li><p>Debug the components in an expression</p></li>
@@ -727,7 +817,7 @@ <h2><span class="section-number">2.10.4. </span>Walrus Operator: Assign a Variab
727817
</div>
728818
</section>
729819
<section id="fine-grained-traceback-in-python-3-11">
730-
<h2><span class="section-number">2.10.5. </span>Fine-Grained Traceback in Python 3.11<a class="headerlink" href="#fine-grained-traceback-in-python-3-11" title="Permalink to this heading">#</a></h2>
820+
<h2><span class="section-number">2.10.6. </span>Fine-Grained Traceback in Python 3.11<a class="headerlink" href="#fine-grained-traceback-in-python-3-11" title="Permalink to this heading">#</a></h2>
731821
<p>Having a clear traceback makes it faster to debug your code. Python 3.11 provides fine-grained error locations in tracebacks, enabling developers to quickly identify the exact location of errors.</p>
732822
<p>The following examples illustrate the difference in traceback between Python 3.9 and Python 3.11.</p>
733823
<div class="cell docutils container">
@@ -843,9 +933,10 @@ <h2><span class="section-number">2.10.5. </span>Fine-Grained Traceback in Python
843933
<ul class="visible nav section-nav flex-column">
844934
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#simplify-conditional-execution-with-match-statements">2.10.1. Simplify Conditional Execution with Match Statements</a></li>
845935
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#structural-pattern-matching-in-python-3-10">2.10.2. Structural Pattern Matching in Python 3.10</a></li>
846-
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#write-union-types-as-x-y-in-python-3-10">2.10.3. Write Union Types as X|Y in Python 3.10</a></li>
847-
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#walrus-operator-assign-a-variable-in-an-expression">2.10.4. Walrus Operator: Assign a Variable in an Expression</a></li>
848-
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#fine-grained-traceback-in-python-3-11">2.10.5. Fine-Grained Traceback in Python 3.11</a></li>
936+
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#enhance-code-readability-with-python-dataclasses-and-match-statements">2.10.3. Enhance Code Readability with Python Dataclasses and Match Statements</a></li>
937+
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#write-union-types-as-x-y-in-python-3-10">2.10.4. Write Union Types as X|Y in Python 3.10</a></li>
938+
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#walrus-operator-assign-a-variable-in-an-expression">2.10.5. Walrus Operator: Assign a Variable in an Expression</a></li>
939+
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#fine-grained-traceback-in-python-3-11">2.10.6. Fine-Grained Traceback in Python 3.11</a></li>
849940
</ul>
850941
</nav></div>
851942

0 commit comments

Comments
 (0)