<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gregory Barillé</title>
    <description>The latest articles on DEV Community by Gregory Barillé (@gregorybarille).</description>
    <link>https://dev.to/gregorybarille</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F334489%2F3aaf04fd-c48f-4d73-bf97-1b88d1514c43.png</url>
      <title>DEV Community: Gregory Barillé</title>
      <link>https://dev.to/gregorybarille</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gregorybarille"/>
    <language>en</language>
    <item>
      <title>Different python objects for dot notation lovers </title>
      <dc:creator>Gregory Barillé</dc:creator>
      <pubDate>Mon, 02 Mar 2020 19:21:19 +0000</pubDate>
      <link>https://dev.to/gregorybarille/different-python-objects-for-dot-notation-lovers-26ba</link>
      <guid>https://dev.to/gregorybarille/different-python-objects-for-dot-notation-lovers-26ba</guid>
      <description>&lt;h1&gt;
  
  
  Why would I want to be able to use dot notation?
&lt;/h1&gt;

&lt;p&gt;For years I've been using dictionaries to store all kind of things, especially when I needed to generate report on large amount of data.&lt;br&gt;
Recently I was working on developing a rest api at work and I wanted to be able to store small pieces of flat data and access them  using dot notation as I find it more elegant and convenient than using the old &lt;em&gt;['key']&lt;/em&gt; of a dictionary.&lt;br&gt;
My criterias were the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I didn't want to "hack" any data type by modifying their behaviors.&lt;/li&gt;
&lt;li&gt;I only want to use the standard library.&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  Solutions:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SimpleNamespace (3.3+)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;namedtuple (2.6+)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enum (3.4+)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dataclass (3.7+)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  Examples
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;SimpleNamespace&lt;/strong&gt; &lt;a&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;It allows you to instantiate an object immediately with any attributes that you like and create/modify them as necessary (it is a subclass of Object):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;types&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SimpleNamespace&lt;/span&gt;

&lt;span class="n"&gt;dummy_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SimpleNamespace&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;#Creation of attributes
&lt;/span&gt;&lt;span class="n"&gt;dummy_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'dummy_name'&lt;/span&gt;
&lt;span class="n"&gt;dummy_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="c1"&gt;#Update of name attribute
&lt;/span&gt;&lt;span class="n"&gt;dummy_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'dummy_name_test'&lt;/span&gt;
&lt;span class="c1"&gt;#Delete the name attribute
&lt;/span&gt;&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;dummy_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;namedtuple&lt;/strong&gt; &lt;a&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;As stated by its name it allows you to create a tuple and access its data by name rather than index.&lt;br&gt;
As for a tuple, you can't modify it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;namedtuple&lt;/span&gt;

&lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;namedtuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Person'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'age'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;dummy_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'dummy_name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Enum&lt;/strong&gt; &lt;a&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;An enum is a class where the attributes name are bound to constant values.&lt;br&gt;
Attributes and values can't be modified.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;enum&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;dummy_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'dummy_name'&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;dataclass&lt;/strong&gt; &lt;a&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;It's just a simple decorator that add special methods to classes (such as &lt;code&gt;__init__&lt;/code&gt; and &lt;code&gt;__repr__&lt;/code&gt;).&lt;br&gt;
As for SimpleNamespace you can modify attributes and values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;

&lt;span class="c1"&gt;#You can add attributes without default value with type hinting.
&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
&lt;span class="n"&gt;dummy_person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;#You can add attributes with default value like with regular class.
&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'dummy_name'&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="n"&gt;dummy_person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;p&gt;As a summary here is a quick table to understand the behavior of each kind of object.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SimpleNamespace&lt;/th&gt;
&lt;th&gt;namedtupled&lt;/th&gt;
&lt;th&gt;Enum&lt;/th&gt;
&lt;th&gt;dataclass&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instantiation&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attribute mutability&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value mutability&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity compare&lt;/td&gt;
&lt;td&gt;Values&lt;/td&gt;
&lt;td&gt;Values&lt;/td&gt;
&lt;td&gt;ID&lt;/td&gt;
&lt;td&gt;ID&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Obviously you can always use regular classes or dictionnary but these objects might simplify your workflow and improve the readability of your code.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://docs.python.org/3/library/types.html#types.SimpleNamespace"&gt;https://docs.python.org/3/library/types.html#types.SimpleNamespace&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.python.org/3/library/collections.html#collections.namedtuple"&gt;https://docs.python.org/3/library/collections.html#collections.namedtuple&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.python.org/3/library/enum.html"&gt;https://docs.python.org/3/library/enum.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.python.org/3/library/dataclasses.html"&gt;https://docs.python.org/3/library/dataclasses.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>codequality</category>
    </item>
  </channel>
</rss>
