<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Gatsby Starter Blog RSS Feed]]></title><description><![CDATA[A blog demonstrating my learnings.]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io</link><generator>GatsbyJS</generator><lastBuildDate>Thu, 27 Feb 2025 03:21:06 GMT</lastBuildDate><item><title><![CDATA[The mystery behind the `__pycache__` folder]]></title><description><![CDATA[If you’ve been diving into Python, you might have stumbled upon a curious directory called . Let’s demystify it a bit! 
Image source: Reddit…]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io/pycache/</link><guid isPermaLink="false">https://gatsbystarterblogsource.gatsbyjs.io/pycache/</guid><pubDate>Tue, 18 Feb 2025 23:46:37 GMT</pubDate><content:encoded>&lt;p&gt;If you’ve been diving into Python, you might have stumbled upon a curious directory called &lt;code class=&quot;language-text&quot;&gt;__pycache__&lt;/code&gt;. Let’s demystify it a bit!&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7bea0cec6dad982240cf6d02182a9f44/0ba47/pycache.webp&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 77.21518987341771%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/webp;base64,UklGRlgAAABXRUJQVlA4IEwAAADwAgCdASoUAA8APtFUo0uoJKMhsAgBABoJaRwAAAiIAAD+8eekjO7tBjI+aMKPcwc3XAadAacAMuglVWF8Lt+bsaZ2raQ7As7QAAAA&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;pycache_image&quot;
        title=&quot;&quot;
        src=&quot;/static/7bea0cec6dad982240cf6d02182a9f44/8aab1/pycache.webp&quot;
        srcset=&quot;/static/7bea0cec6dad982240cf6d02182a9f44/81b7c/pycache.webp 158w,
/static/7bea0cec6dad982240cf6d02182a9f44/6ea66/pycache.webp 315w,
/static/7bea0cec6dad982240cf6d02182a9f44/8aab1/pycache.webp 630w,
/static/7bea0cec6dad982240cf6d02182a9f44/0ba47/pycache.webp 640w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;em&gt;Image source: Reddit&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;What is &lt;code class=&quot;language-text&quot;&gt;__pycache__&lt;/code&gt;?&lt;/h3&gt;
&lt;p&gt;Simply put, &lt;code class=&quot;language-text&quot;&gt;__pycache__&lt;/code&gt; is a special folder created by Python. It stores the compiled bytecode files (those ending with &lt;code class=&quot;language-text&quot;&gt;.pyc&lt;/code&gt;) of your scripts. These are optimized versions of your code, meant to speed up the execution process.&lt;/p&gt;
&lt;h3&gt;Why is it used?&lt;/h3&gt;
&lt;p&gt;The main reason for &lt;code class=&quot;language-text&quot;&gt;__pycache__&lt;/code&gt; is to boost the performance of your Python programs. When you run a Python script, it gets compiled into bytecode. By storing these bytecode files, Python can skip recompiling on subsequent runs, leading to faster startup times.&lt;/p&gt;
&lt;h3&gt;What about its naming convention?&lt;/h3&gt;
&lt;p&gt;Inside &lt;code class=&quot;language-text&quot;&gt;__pycache__&lt;/code&gt;, you’ll find &lt;code class=&quot;language-text&quot;&gt;.pyc&lt;/code&gt; files with names like &lt;code class=&quot;language-text&quot;&gt;module_name.cpython-version.pyc&lt;/code&gt;. This structure ensures compatibility across different Python versions. For instance, &lt;code class=&quot;language-text&quot;&gt;example.cpython-39.pyc&lt;/code&gt; means it was compiled with CPython version 3.9. There are other Python distributions specific for different use-cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPython&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CPython is the Python reference implementation, the standard version that all other Python incarnations look to. CPython is written in C, as implied by the name, and is produced by the same core group of people responsible for making top-level decisions about the Python language.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anaconda Python&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anaconda, produced by Anaconda Inc. (formerly Continuum Analytics), is designed for Python developers who need a distribution backed by a commercial provider and with support plans for enterprises. The chief use cases for Anaconda Python are math, statistics, engineering, data analysis, machine learning, and related applications.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ActiveState Python&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like Anaconda, ActiveState Python is created and maintained by a for-profit company—in this case, ActiveState, which markets a number of language runtimes along with the multi-language Komodo IDE.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PyPy&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A drop-in replacement for the CPython interpreter, PyPy uses JIT compilation to speed up the execution of Python programs. Depending on the task, the performance gains can be dramatic.&lt;/p&gt;
&lt;p&gt;and many more.&lt;/p&gt;
&lt;h3&gt;When does it get created?&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;__pycache__&lt;/code&gt; pops up automatically when you run a Python script that imports another module. If you’re running a standalone file, it doesn’t show up. If the relevant &lt;code class=&quot;language-text&quot;&gt;.pyc&lt;/code&gt; files don’t exist yet, or if the source file has changed since the last run, Python will compile the source code and store the bytecode in &lt;code class=&quot;language-text&quot;&gt;__pycache__&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Should You Delete pycache?&lt;/h3&gt;
&lt;p&gt;You may wonder whether it&apos;s safe to delete the &quot;&lt;strong&gt;pycache&lt;/strong&gt;&quot; folder. In most cases, it&apos;s entirely safe, as Python will recreate it as needed.&lt;/p&gt;
&lt;p&gt;However, there are some scenarios where you might want to keep it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Development&lt;/strong&gt;: During development, it&apos;s convenient to keep &quot;&lt;strong&gt;pycache&lt;/strong&gt;&quot; to benefit from faster module imports. Deleting it won&apos;t harm your code, but it might slow down imports temporarily until Python recreates the bytecode files&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment&lt;/strong&gt;: When deploying your Python code, you can safely omit the &quot;pycache&quot; folder. It won&apos;t affect your production environment, and it can save space.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, &lt;code class=&quot;language-text&quot;&gt;__pycache__&lt;/code&gt; is a behind-the-scenes helper in Python that enhances the performance and compatibility of your code. It automatically stores compiled bytecode, making your Python programs run faster.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Think next when you write that for loop!]]></title><description><![CDATA[If you've worked with Python before, you've probably come across this code snippet in various forms. The  loop is a crucial tool in Python…]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io/think-next/</link><guid isPermaLink="false">https://gatsbystarterblogsource.gatsbyjs.io/think-next/</guid><pubDate>Wed, 21 Feb 2024 23:46:37 GMT</pubDate><content:encoded>&lt;p&gt;If you&apos;ve worked with Python before, you&apos;ve probably come across this code snippet in various forms.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;numbers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
sum_result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; num &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; numbers&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    sum_result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; num

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Sum using for loop:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sum_result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; loop is a crucial tool in Python for iterating over sequences, and it&apos;s widely used. It&apos;s great for cases where you want a clear and easy-to-read iteration structure, and its benefits have made it popular and useful.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Readability&lt;/strong&gt;: &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; loops are generally easy to read and understand. The structure of a for loop makes it clear that you are iterating over a sequence (in this case, a list of numbers).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simplicity&lt;/strong&gt; : For simple iteration tasks, a &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; loop provides a straightforward and concise way to express the logic without unnecessary boilerplate code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Versatility&lt;/strong&gt;:&lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; loops can iterate over various iterable objects, including lists, tuples, strings, and more. This versatility makes them suitable for a wide range of use cases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Control Flow&lt;/strong&gt;: The &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;continue&lt;/code&gt; statements can be used within a &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; loop to control the flow of execution, allowing for more complex logic when needed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Index Access&lt;/strong&gt;: In addition to iterating over the elements directly, you can use the &lt;code class=&quot;language-text&quot;&gt;enumerate()&lt;/code&gt; with a &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; loop to access both the index and the element in each iteration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;The problem&lt;/h1&gt;
&lt;p&gt;However, even though it&apos;s a simple and essential building block for developers, it can sometimes make your code inefficient. For example, let&apos;s take a look at this case:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;numbers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;17&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;23&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;28&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;29&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;31&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;33&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;35&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;37&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;39&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

first_even &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; num &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; numbers&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; num &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        first_even &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; num
        &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;First even number (using for loop):&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; first_even&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this specific example, if &lt;code class=&quot;language-text&quot;&gt;numbers&lt;/code&gt; were a very large list, a &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; loop would continue iterating over the entire list.&lt;/p&gt;
&lt;h1&gt;The solution: &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;Now, let&apos;s find the first even number using &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;first_even &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; num &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; numbers &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; num &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;First even number (using next()):&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; first_even&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Using &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt; can lead to better performance and resource utilization in situations where you only need the first matching element.
In the example provided, &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt; efficiently finds the first element that satisfies the condition and stops iterating. This can be advantageous when dealing with large datasets or when the iteration process is time-consuming.&lt;/p&gt;
&lt;p&gt;Additionally, the use of &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt; can result in more concise and expressive code, especially when the logic for finding the element is straightforward. It eliminates the need for a separate variable and an explicit &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt; statement, making the code cleaner and easier to read.&lt;/p&gt;
&lt;p&gt;Overall, while the &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; loop is a fundamental tool in Python, considering alternatives like &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt; can improve code efficiency and readability in specific scenarios.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conciseness:&lt;/strong&gt; Using &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt; often results in more concise and expressive code. It allows you to express the iteration and condition in a single line, which can be easier to read and understand, especially for simple cases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Efficiency:&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt; stops iterating as soon as it finds the first element that satisfies the condition. In contrast, a &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; loop would continue iterating over the entire iterable even after finding the desired element. This can be more efficient, especially with large iterables, as it avoids unnecessary iterations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Readability:&lt;/strong&gt; For simple conditions, using &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt; can make the code more readable by eliminating the need for explicit loop constructs and breaking out of the loop. It can be particularly useful when the goal is to find the first occurrence that satisfies a condition.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lazy evaluation:&lt;/strong&gt; The generator expression used with &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt; allows for lazy evaluation. It generates values on-the-fly and stops as soon as a match is found. This can be advantageous when working with potentially infinite iterables.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Lazy evaluation&lt;/h2&gt;
&lt;p&gt;Lazy evaluation is a programming concept that involves delaying the evaluation of an expression until its value is required. In the case of Python and using &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt; with a generator expression, lazy evaluation means that the values are generated dynamically and only when they are actually needed.&lt;/p&gt;
&lt;p&gt;With lazy evaluation, the generator expression is not executed immediately upon definition. Instead, it is executed step by step, generating the next value in the sequence as it is requested. This approach is particularly useful when working with iterables that could potentially be infinite or when there is no need to generate all the values upfront.&lt;/p&gt;
&lt;p&gt;By employing lazy evaluation, you can optimize resource utilization and improve performance by only generating the values that are necessary at any given moment. This can be especially advantageous when dealing with large datasets or when the generation process is time-consuming.&lt;/p&gt;
&lt;p&gt;Overall, lazy evaluation provides a flexible and efficient way to handle sequences of values, allowing for on-demand generation and consumption of data.&lt;/p&gt;
&lt;p&gt;To illustrate lazy evaluation, let&apos;s consider an example.&lt;/p&gt;
&lt;p&gt;Using &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; loop:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;counter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
infinite_squares &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; num &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;inf&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    infinite_squares&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num &lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    counter &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; counter &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Breaking to prevent an infinite loop; not recommended in practice&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;First 5 squares using for loop:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; infinite_squares&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Using &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt; for lazy evaluation (finite extraction from infinite iterable):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;infinite_squares_generator &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num &lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; num &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;inf&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
infinite_squares &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;infinite_squares_generator&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;First 5 squares using lazy evaluation:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; infinite_squares&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this case, we have a generator expression called &lt;code class=&quot;language-text&quot;&gt;infinite_squares_generator&lt;/code&gt; that represents an infinite sequence of squares. We use the &lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt; function to extract the first 5 squares from this infinite sequence.&lt;/p&gt;
&lt;p&gt;With lazy evaluation, the generator doesn&apos;t attempt to calculate all squares upfront. Instead, it produces values as they are requested, allowing for more controlled and efficient handling of infinite sequences.&lt;/p&gt;
&lt;p&gt;Lazy evaluation can be particularly useful when working with large or infinite datasets, as it can be more memory-efficient and avoid unnecessary computations. By computing values only when they are needed in the program&apos;s execution flow, it allows for more responsive and efficient use of resources.&lt;/p&gt;
&lt;p&gt;Overall, lazy evaluation is a powerful programming concept that can help optimize performance and resource utilization in a variety of scenarios.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The real harm of using ChatGPT that nobody is talking about]]></title><description><![CDATA[Do you find yourself wanting to use ChatGPT for everything? Consider again! ChatGPT is a powerful AI tool that can assist you with certain…]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io/chatGPT/</link><guid isPermaLink="false">https://gatsbystarterblogsource.gatsbyjs.io/chatGPT/</guid><pubDate>Fri, 24 Mar 2023 23:46:37 GMT</pubDate><content:encoded>&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 400px; &quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/3ad9d22744195ce3e6cd8454e77d2d57/066f9/chat-gpt-harms.jpg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 65.18987341772153%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABQAD/8QAFAEBAAAAAAAAAAAAAAAAAAAAA//aAAwDAQACEAMQAAABIdD2dVrOIv/EABsQAAICAwEAAAAAAAAAAAAAAAECAAQDEyEj/9oACAEBAAEFAhyP6B6Ssywdx1rJ1f/EABgRAAIDAAAAAAAAAAAAAAAAAAECEBIx/9oACAEDAQE/AQlsj//EABcRAQADAAAAAAAAAAAAAAAAAAABEXH/2gAIAQIBAT8Bxcv/xAAdEAABBAIDAAAAAAAAAAAAAAAAAQIREjFBECEi/9oACAEBAAY/AuhjtLBN14quG4PSTGz/xAAaEAEAAwEBAQAAAAAAAAAAAAABABExIUGh/9oACAEBAAE/Iba9OwhAj/URMb8Cbib1UdZGkuqup//aAAwDAQACAAMAAAAQcx//xAAWEQEBAQAAAAAAAAAAAAAAAAABABH/2gAIAQMBAT8QZ5Nb/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAECAQE/EERGbX//xAAcEAEAAwACAwAAAAAAAAAAAAABABEhQVExceH/2gAIAQEAAT8QNKloPZstmDOg/DF8PAUTj7lLi5sdo2R4qqlCXnnZ/9k=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;chat gpt harms&quot; title=&quot;&quot; src=&quot;/static/3ad9d22744195ce3e6cd8454e77d2d57/066f9/chat-gpt-harms.jpg&quot; srcset=&quot;/static/3ad9d22744195ce3e6cd8454e77d2d57/ff44c/chat-gpt-harms.jpg 158w,
/static/3ad9d22744195ce3e6cd8454e77d2d57/a6688/chat-gpt-harms.jpg 315w,
/static/3ad9d22744195ce3e6cd8454e77d2d57/066f9/chat-gpt-harms.jpg 400w&quot; sizes=&quot;(max-width: 400px) 100vw, 400px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;p&gt;&lt;strong&gt;Do you find yourself wanting to use ChatGPT for everything?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Consider again!&lt;/p&gt;
&lt;p&gt;ChatGPT is a powerful AI tool that can assist you with certain tasks, but it can also impair your thinking, analytical, and creative abilities over time.&lt;/p&gt;
&lt;p&gt;This is why:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h3&gt;&lt;em&gt;&quot;Education is not just about finding the right answers to questions in your textbooks but internalising the concepts and learning how to apply them in real-world&quot;&lt;/em&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ChatGPT is not a replacement for learning. It can generate text based on keywords, but it has no understanding of the actual meaning &amp;#x26; context.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It can tell you the answers your questions from the internet but it can&apos;t educate you. If you rely solely on ChatGPT for your education &amp;#x26; research, you will miss out on learning how to research about a topic, scour through books, internet and learn from experts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;&lt;em&gt;&quot;Googling is an art&quot;&lt;/em&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ChatGPT is not a replacement for thinking. It can generate coherent sentences, but there is no logic or reasoning behind them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is not capable of analysing problems and making decisions out of them. You lose your ability to think critically and analyse things when you expect ChatGPT to give a direct answer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You learn when you try different solutions to a problem and analyse the outcomes. And most often than not, there&apos;s no &lt;em&gt;one size fits all&lt;/em&gt; for our problems.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h3&gt;&lt;em&gt;&quot;Art is an expression of our thoughts, emotions, intuitions, and desires&quot;&lt;/em&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ChatGPT is not a replacement for creating. It can mimic different styles and formats, but it lacks originality and personality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is cannot express your voice, vision, emotions and personality. Once invests time to learn a craft like writing, drawing, painting. Once attaiining a level of skill, one learns to express himself through his craft.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You never learn a craft to create something unique and meaningful if you rely on ChatGPT for your writing or art.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&apos;t let ChatGPT rob you off the unique skills that separate humans and AI-machines! Use it sparingly and always double-check its output for accuracy and quality. Keep in mind that nothing can ever replace your own brain and creativity!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;**This blog was generated &amp;#x26; paraphrased using ChatGPT&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Exploring the Power of Python Data Classes]]></title><description><![CDATA[Why and Where to Use Them In Python, when we think of a class, a structure like this comes to our mind which is not so intuitive.
What if we…]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io/python-dataclasses/</link><guid isPermaLink="false">https://gatsbystarterblogsource.gatsbyjs.io/python-dataclasses/</guid><pubDate>Sat, 28 Jan 2023 23:46:37 GMT</pubDate><content:encoded>&lt;h2&gt;Why and Where to Use Them&lt;/h2&gt;
&lt;p&gt;In Python, when we think of a &lt;em&gt;class&lt;/em&gt;, a structure like this comes to our mind&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Student&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; first_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; age&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; grade&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;first_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; first_name
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; last_name
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; age
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;grade &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; grade

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;function1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;arg1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; arg2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;pass&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which is not so intuitive.
What if we could have a more intuitive &amp;#x26; less repeatitive way of doing the same thing?&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass
&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Student&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
     first_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# attribute 1&lt;/span&gt;
     last_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;# attribute 2&lt;/span&gt;
     age&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;         &lt;span class=&quot;token comment&quot;&gt;# attribute 3&lt;/span&gt;
     job&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;         &lt;span class=&quot;token comment&quot;&gt;# attribute 4&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;function1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;arg1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; arg2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# functionality 1&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;pass&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Yes, we are talking about the &lt;a href=&quot;https://docs.python.org/3/library/dataclasses.html&quot;&gt;Data Classes&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Less biolerplate code&lt;/li&gt;
&lt;li&gt;More intuitive&lt;/li&gt;
&lt;li&gt;Type Annotations, to help you &amp;#x26; your text editor with better type checking &amp;#x26; linting&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;In this blog&lt;/em&gt;, we&apos;ll focus on &lt;strong&gt;why&lt;/strong&gt; you should use DataClasses &amp;#x26; &lt;strong&gt;where&lt;/strong&gt; you should use them.
For a deeper dive in DataClasses, I&apos;ll attach resources.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;REQUIREMENTS&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.7+ 🐍&lt;/li&gt;
&lt;li&gt;A zeal to learn 😊&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When working with data-oriented classes, that behave like data-containers, you might want to create many instances of them ,compare, sort the objects and do a lot of data centric operations. Such functionalities are not provided right out of the box by regular classes. Data classes can hlp you achieve those functionalities with a more compact &amp;#x26; intuitive code.&lt;/p&gt;
&lt;h3&gt;1. &lt;strong&gt;Less code to define a class&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass
&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Student&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
     first_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# attribute 1&lt;/span&gt;
     last_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;# attribute 2&lt;/span&gt;
     age&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;         &lt;span class=&quot;token comment&quot;&gt;# attribute 3&lt;/span&gt;
     grade&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;       &lt;span class=&quot;token comment&quot;&gt;# attribute 4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The dataclass decorator &lt;code class=&quot;language-text&quot;&gt;@dataclass&lt;/code&gt; is actually a code generator that automatically adds other methods under the hood. It adds methods like &lt;code class=&quot;language-text&quot;&gt;__init__&lt;/code&gt; , &lt;code class=&quot;language-text&quot;&gt;__eq__&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;__repr__&lt;/code&gt; and many more to your class. These methods are responsible for setting the attribute values, testing for equality and representing objects in a nice string format.&lt;/p&gt;
&lt;h3&gt;2. &lt;strong&gt;Default values for attributes&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass
&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Student&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    first_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;John&quot;&lt;/span&gt;
    last_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Smith&quot;&lt;/span&gt;
    age&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;
    grade&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As a general python convention, &lt;em&gt;&quot;fields without default values cannot appear after fields with default values.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;3. &lt;strong&gt;Customised representation of the objects&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;__repr__()&lt;/code&gt; can be modified to ovverride the default presentation of objects in the console&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass


&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Student&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    first_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;John&quot;&lt;/span&gt;
    last_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Smith&quot;&lt;/span&gt;
    age&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;
    grade&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__repr__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;first_name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; age &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;, studies in grade &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;grade&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;


john &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Student&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;john&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# John Smith age 12, studies in grade 5&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# instead of&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Student(first_name=&apos;John&apos;, last_name=&apos;Smith&apos;, age=12, grade=5)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The same can be achieved by using a &lt;code class=&quot;language-text&quot;&gt;__str__()&lt;/code&gt; which works with regular classes as well.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__str__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;first_name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; age &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;, studies in grade &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;grade&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# John Smith age 12, studies in grade 5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;4. &lt;strong&gt;Easy conversion to a tuple or a dictionary&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Always converting objects to &lt;code class=&quot;language-text&quot;&gt;dict&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;tuple&lt;/code&gt; when interacting with other programs that expect these formats? Objects can be easily serialized into dicts or tuples using Data Classes.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; asdict&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; astuple


&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Student&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    first_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;John&quot;&lt;/span&gt;
    last_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Smith&quot;&lt;/span&gt;
    age&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;
    grade&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# def __repr__(self):&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;#     return f&quot;{self.first_name} {self.last_name} age {self.age}, studies in grade {self.grade}&quot;&lt;/span&gt;


john &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Student&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;john&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;astuple&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;john&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# (&apos;John&apos;, &apos;Smith&apos;, 12, 5)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;asdict&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;john&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# {&apos;first_name&apos;: &apos;John&apos;, &apos;last_name&apos;: &apos;Smith&apos;, &apos;age&apos;: 12, &apos;grade&apos;: 5}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;5. &lt;strong&gt;Create READ-only objects&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;There are times when you want to prevent anyone from modifying the values of the attributes once the object is instantiated i.e. you want a &lt;code class=&quot;language-text&quot;&gt;frozen&lt;/code&gt; or an &lt;em&gt;immutable&lt;/em&gt; instance.&lt;/p&gt;
&lt;p&gt;This can be achieved by using &lt;code class=&quot;language-text&quot;&gt;@dataclass(frozen=True)&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass

&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;frozen&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Student&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    first_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;John&quot;&lt;/span&gt;
    last_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Smith&quot;&lt;/span&gt;
    age&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;
    grade&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;

john &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Student&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;john&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

john&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you set a &lt;code class=&quot;language-text&quot;&gt;frozen&lt;/code&gt; object’s attribute to a new value, a &lt;code class=&quot;language-text&quot;&gt;FrozenInstanceError&lt;/code&gt; error will be raised.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;Student&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;first_name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;John&apos;&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;last_name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Smith&apos;&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;, &lt;span class=&quot;token assign-left variable&quot;&gt;grade&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Traceback &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;most recent call last&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;:
  File &lt;span class=&quot;token string&quot;&gt;&quot;student.py&quot;&lt;/span&gt;, line &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;, &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;module&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    john.age &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;
  File &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;string&gt;&quot;&lt;/span&gt;, line &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;, &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; __setattr__
dataclasses.FrozenInstanceError: cannot assign to field &lt;span class=&quot;token string&quot;&gt;&apos;age&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Also a &lt;code class=&quot;language-text&quot;&gt;__hash__()&lt;/code&gt; will be automatically created by Python when &lt;code class=&quot;language-text&quot;&gt;frozen=True&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;6. &lt;strong&gt;Comparison of objects&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;john_again &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Student&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;first_name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;John&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last_name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Smith&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; age&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; grade&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;john &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; john_again&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In order to compare two objects &lt;code class=&quot;language-text&quot;&gt;john&lt;/code&gt; &amp;#x26; &lt;code class=&quot;language-text&quot;&gt;john_again&lt;/code&gt;, you’d have to implement the &lt;code class=&quot;language-text&quot;&gt;__eq__&lt;/code&gt; method yourself.
This method should first check that the two objects are instances of the same class and then test the equality between tuples of attributes.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__eq__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; other&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;__class__ &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;__class__&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; NotImplemented
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;first_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;grade&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;other&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;first_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                            other&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                            other&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                            other&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;grade&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now if you decide to add new attributes to your class, you’d have to update the &lt;code class=&quot;language-text&quot;&gt;__eq__()&lt;/code&gt; method again. Then do the same for &lt;code class=&quot;language-text&quot;&gt;__ge__()&lt;/code&gt; , &lt;code class=&quot;language-text&quot;&gt;__gt__()&lt;/code&gt; ,&lt;code class=&quot;language-text&quot;&gt;__le__()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;__lt__()&lt;/code&gt; if they’re used.&lt;/p&gt;
&lt;p&gt;But, with DataClass, it works out of the box&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;john &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; john_again&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# True&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;strong&gt;ADVANCED FEATURE: SORTING&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;It&apos;s also possible to &lt;strong&gt;sort&lt;/strong&gt; &amp;#x26; &lt;strong&gt;compare&lt;/strong&gt; objects based on an attribute as a default.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; field  &lt;span class=&quot;token comment&quot;&gt;# import field&lt;/span&gt;


&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;order&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# tells dataclass that we want to compare objects&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Student&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    first_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;John&quot;&lt;/span&gt;
    last_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Smith&quot;&lt;/span&gt;
    age&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;
    grade&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
    sort_index&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; field&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;init&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;repr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# init = False, means sort_index will be initialised after &apos;age&apos; is initialised&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# repr = False, means sort_index will not be printed&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__post_init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sort_index &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age


john &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Student&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;age&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;john&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Student(first_name=&apos;John&apos;, last_name=&apos;Smith&apos;, age=15, grade=5)&lt;/span&gt;

sam &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Student&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;age&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sam&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Student(first_name=&apos;John&apos;, last_name=&apos;Smith&apos;, age=20, grade=5)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sam &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; john&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# True&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, &lt;code class=&quot;language-text&quot;&gt;__gt__()&lt;/code&gt; considers &lt;code class=&quot;language-text&quot;&gt;age&lt;/code&gt; attribute for comparison.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QUESTION&lt;/strong&gt;❓&lt;strong&gt;How&apos;d you sort a frozen set?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using the &lt;code class=&quot;language-text&quot;&gt;__setattr__()&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; field  &lt;span class=&quot;token comment&quot;&gt;# import field&lt;/span&gt;


&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;order&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; frozen&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# enable order=True&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Student&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    first_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;John&quot;&lt;/span&gt;
    last_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Smith&quot;&lt;/span&gt;
    age&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;
    grade&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
    sort_index&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; field&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;init&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;repr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# init = False, means sort_index will be initialised after &apos;age&apos; is initialised&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# repr = False, means sort_index will not be printed&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__post_init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token builtin&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;__setattr__&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;sort_index&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;


john &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Student&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;age&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;john&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Student(first_name=&apos;John&apos;, last_name=&apos;Smith&apos;, age=15, grade=5)&lt;/span&gt;

sam &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Student&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;age&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sam&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Student(first_name=&apos;John&apos;, last_name=&apos;Smith&apos;, age=20, grade=5)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sam &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; john&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# True&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;⭐&lt;strong&gt;BONUS&lt;/strong&gt;⭐&lt;/h3&gt;
&lt;p&gt;If you&apos;ve read this far, here&apos;s an advanced functionality of DataClasses&lt;/p&gt;
&lt;h3&gt;7. &lt;strong&gt;Initialize internal attributes&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;In some situations, you may need to create an attribute that is only defined internally, not when the class is instantiated. The attribute has a value that can depend on previously-set attributes.&lt;br&gt;
The &lt;code class=&quot;language-text&quot;&gt;__post_init__()&lt;/code&gt; is called right after the &lt;code class=&quot;language-text&quot;&gt;__init__()&lt;/code&gt; method is called.
By using this function and setting its &lt;code class=&quot;language-text&quot;&gt;init=False&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;repr=True&lt;/code&gt; we can create a new field called &lt;code class=&quot;language-text&quot;&gt;full_name&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; field  &lt;span class=&quot;token comment&quot;&gt;# import field&lt;/span&gt;

&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Student&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    first_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;John&quot;&lt;/span&gt;
    last_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Smith&quot;&lt;/span&gt;
    age&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;
    grade&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
    full_name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; field&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;init&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;repr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__post_init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
         self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;full_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;first_name &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last_name

john &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Student&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;john&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Student(first_name=&apos;John&apos;, last_name=&apos;Smith&apos;, age=12, grade=5, full_name=&apos;John Smith&apos;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;john&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;full_name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# John Smith&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can still instantiate the &lt;code class=&quot;language-text&quot;&gt;Student&lt;/code&gt; class without setting the &lt;code class=&quot;language-text&quot;&gt;full_name&lt;/code&gt; attribute.
The &lt;code class=&quot;language-text&quot;&gt;repr=True&lt;/code&gt; makes it visible when the object is printed.&lt;/p&gt;
&lt;h3&gt;It&apos;s all great but where do I use it?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If you have Python 3.7+ 😛&lt;/li&gt;
&lt;li&gt;You&apos;re working on a data-centric scenario
&lt;ul&gt;
&lt;li&gt;It&apos;s a data-driven scenario &amp;#x26; less behaviour-driven&lt;/li&gt;
&lt;li&gt;You need to create many data-centric classes&lt;/li&gt;
&lt;li&gt;Optionally, you need to ensure a degree of &lt;em&gt;immutability&lt;/em&gt; on the objects of this class.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example from &lt;code class=&quot;language-text&quot;&gt;artifacts.py&lt;/code&gt; showing how Data Classes are used for data-centric classes in production code.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; dataclasses &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; dataclass


&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DataIngestionArtifact&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    trained_file_path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    test_file_path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;


&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DataValidationArtifact&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    validation_status&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;bool&lt;/span&gt;
    valid_train_file_path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    valid_test_file_path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    invalid_train_file_path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    invalid_test_file_path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    drift_report_file_path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;


&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@dataclass&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;DataTransformationArtifact&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    transformed_object_file_path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    transformed_train_file_path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    transformed_test_file_path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Resources&lt;/h4&gt;
&lt;p&gt;While learning about dataclasses, I went through many resources, here’s a list of the best I’ve found.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://towardsdatascience.com/9-reasons-why-you-should-start-using-python-dataclasses-98271adadc66&quot;&gt;9 Reasons Why You Should Start Using Python Dataclasses&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/vRVVyl9uaZc&quot;&gt;If you&apos;re not using Python DATA CLASSES yet, you should 🚀&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;www.realpython.com/python-data-classes/&quot;&gt;Data Classes in Python 3.7+ (Guide)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/3/library/dataclasses.html&quot;&gt;Data Classes Python documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;I have tried to be thorough and cover most of the use cases, yet, no man is perfect. Reach out if you find mistakes, or want me to pay attention to relevant use cases.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Thanks for reading 🙏
If you’ve made it this far, I really thank you for your time 😊
That’ll be all for me today. Until next time 👋&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Reviving an Old PC 🖥]]></title><description><![CDATA[A Step-by-Step Guide to Installing Linux Mint XFCE with Windows 7 and Zorin OS Lite in Dual Boot ⚠️Caution: Please follow this post…]]></description><link>https://gatsbystarterblogsource.gatsbyjs.io/linux-mint/</link><guid isPermaLink="false">https://gatsbystarterblogsource.gatsbyjs.io/linux-mint/</guid><pubDate>Sun, 22 Jan 2023 23:46:37 GMT</pubDate><content:encoded>&lt;h2&gt;A Step-by-Step Guide to Installing Linux Mint XFCE with Windows 7 and Zorin OS Lite in Dual Boot&lt;/h2&gt;
&lt;img src=&quot;https://www.linuxmint.com/pictures/screenshots/vera/xfce.png&quot; style=&quot;width: 500px; height: 300px;&quot;&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;⚠️Caution:&lt;/strong&gt; Please follow this post cautiously. I will not be responsible for any issue caused to your system.&lt;/p&gt;
&lt;p&gt;You can google and find various blogs &amp;#x26; videos that will tell you all the standard steps to follow.
But this post is specific to my situation. The constraints I had, the errors I faced &amp;#x26; the solutions that worked for me.&lt;/p&gt;
&lt;h3&gt;Requirements&lt;/h3&gt;
&lt;ol start=&quot;0&quot;&gt;
&lt;li&gt;Stable internet &amp;#x26; electricity connection&lt;/li&gt;
&lt;li&gt;Advanced knowledge about Windows &amp;#x26; Linux&lt;/li&gt;
&lt;li&gt;1 Old PC&lt;/li&gt;
&lt;li&gt;1 Pen Drive&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Preparation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;⚠️Caution:&lt;/strong&gt; Take a back up of your data before proceeding.&lt;/p&gt;
&lt;p&gt;If Windows 7 is your permanent OS &amp;#x26; you don&apos;t have any other in dual boot, follow &lt;a href=&quot;https://linuxmint-installation-guide.readthedocs.io/en/latest/index.html&quot;&gt;this&lt;/a&gt; wonderful guide on how to proceed.&lt;/p&gt;
&lt;p&gt;If you already have any other OS in dual boot with Windows 7, you might need to uninstall it, like I did.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prepare the bootable USB&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://linuxmint-installation-guide.readthedocs.io/en/latest/_images/etcher.png&quot; style=&quot;width: 500px; height: 300px;&quot;&gt;
&lt;p&gt;Follow &lt;a href=&quot;https://linuxmint-installation-guide.readthedocs.io/en/latest/burn.html&quot;&gt;these&lt;/a&gt; steps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Uninstall Zorin OS&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://assets.zorincdn.com/images/releases/15/15-Lite.png&quot; style=&quot;width: 500px; height: 300px;&quot;&gt;
&lt;p&gt;Following steps from this video&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/DxtIy2uj9vs&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;I didn&apos;t had a bootable CD for Windows to fix boot menu. So I jumped to uninstalling Zorin.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Delete Partition&lt;/code&gt; was not enabled for me somehow. I tried to fix it but ended up extending the volume.&lt;/li&gt;
&lt;li&gt;EasyBCD or any similar tool is not mandatory as you can fix your BCD using Windows Command Prompt&lt;/li&gt;
&lt;li&gt;I rebooted my system to begin installing Linux Mint&lt;/li&gt;
&lt;/ul&gt;
&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/756206e523a8a108a7b0106ae5986244/72e01/Advanced-Boot-Options.jpg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAcZLKRGD/8QAGhAAAgMBAQAAAAAAAAAAAAAAAQIAERIDE//aAAgBAQABBQK3rTzRgXpXk5hRhP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABcQAQEBAQAAAAAAAAAAAAAAAAAxAeH/2gAIAQEABj8Curq66iP/xAAbEAEAAgIDAAAAAAAAAAAAAAABACERgTGh4f/aAAgBAQABPyE9DEmz3FeW3FUzCq+0Qwx//9oADAMBAAIAAwAAABAQD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EAB0QAQEAAgEFAAAAAAAAAAAAAAERADFRIWFxwfD/2gAIAQEAAT8QjSE8MkkeKMZrHKnBemE+OWCL3L7zopO9mf/Z&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Advanced Boot Options&quot; title=&quot;&quot; src=&quot;/static/756206e523a8a108a7b0106ae5986244/828fb/Advanced-Boot-Options.jpg&quot; srcset=&quot;/static/756206e523a8a108a7b0106ae5986244/ff44c/Advanced-Boot-Options.jpg 158w,
/static/756206e523a8a108a7b0106ae5986244/a6688/Advanced-Boot-Options.jpg 315w,
/static/756206e523a8a108a7b0106ae5986244/828fb/Advanced-Boot-Options.jpg 630w,
/static/756206e523a8a108a7b0106ae5986244/0ede0/Advanced-Boot-Options.jpg 945w,
/static/756206e523a8a108a7b0106ae5986244/72e01/Advanced-Boot-Options.jpg 1024w&quot; sizes=&quot;(max-width: 630px) 100vw, 630px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;ul&gt;
&lt;li&gt;You can try to enter Windows recovery by following &lt;a href=&quot;https://neosmart.net/wiki/system-recovery-options/&quot;&gt;these&lt;/a&gt; steps if feasible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Installing Linux Mint&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://linuxmint-installation-guide.readthedocs.io/en/latest/_images/grub-efi.png&quot; style=&quot;width: 500px; height: 300px;&quot;&gt;
&lt;p&gt;I got a similar GRUB menu &amp;#x26; followed the steps described &lt;a href=&quot;https://linuxmint-installation-guide.readthedocs.io/en/latest/boot.html&quot;&gt;here&lt;/a&gt;
After installation is completed. We have to fix boot menu before restarting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Repair Boot Menu&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://linuxhint.com/wp-content/uploads/2018/09/10-6.png&quot; style=&quot;width: 500px; height: 300px;&quot;&gt;
&lt;p&gt;It is possible to fix any boot issues using Linux. In fact, if you are stuck in a situation try to boot into another OS &amp;#x26; fix the boot issues.&lt;/p&gt;
&lt;p&gt;Boot Repair is a tool to repair common boot issues on Ubuntu, Debian, Arch, Linux Mint, OpenSUSE, Fedora and other Linux distributions, Windows and Mac OS operating systems.
I followed &lt;a href=&quot;https://linuxhint.com/ubuntu_boot_repair_tutorial/&quot;&gt;this&lt;/a&gt; guide.&lt;/p&gt;
&lt;p&gt;You have to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install Boot Repair&lt;/li&gt;
&lt;li&gt;Do Recommended Repair&lt;/li&gt;
&lt;li&gt;Backup Partition Table&lt;/li&gt;
&lt;li&gt;Repair File System&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Try rebooting &amp;#x26; check if both Linux Mint &amp;#x26; Windows 7 are working as expected.&lt;/p&gt;
&lt;p&gt;👋 You have successfully installed Linux Mint in dual boot with Windows 7 after uninstalling Zorin OS! 🥳&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Thanks for reading 🙏
If you’ve made it this far, I really thank you for your time :)
That’ll be all for me today. Until next time 👋&lt;/p&gt;</content:encoded></item></channel></rss>