<?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: Amine</title>
    <description>The latest articles on DEV Community by Amine (@aminehorseman).</description>
    <link>https://dev.to/aminehorseman</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%2F68001%2F402bd1f7-2d64-445c-8da3-6cb987a6c4cb.jpeg</url>
      <title>DEV Community: Amine</title>
      <link>https://dev.to/aminehorseman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aminehorseman"/>
    <language>en</language>
    <item>
      <title>How to use Type Hints in Dynamic Languages : Python, PHP, JS</title>
      <dc:creator>Amine</dc:creator>
      <pubDate>Tue, 29 Oct 2024 12:58:18 +0000</pubDate>
      <link>https://dev.to/aminehorseman/the-irony-of-static-typing-in-dynamic-languages-31g1</link>
      <guid>https://dev.to/aminehorseman/the-irony-of-static-typing-in-dynamic-languages-31g1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;You can also read this &lt;a href="https://medium.com/@AmineHorseman/the-irony-of-static-typing-in-dynamic-languages-904c7f19b241" rel="noopener noreferrer"&gt;article on Medium&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's always funny when we see how programming languages evolve over time.&lt;/p&gt;

&lt;p&gt;One upon a time, when I started my journey in the software development world, dynamic languages such as Python, PHP and JavaScript were appreciated for their flexibility and concise syntax suited for rapid development. &lt;/p&gt;

&lt;p&gt;However, as these languages evolve, they incorporate new features inspired by &lt;em&gt;statically typed&lt;/em&gt; languages like C++ and Java. One such feature is &lt;em&gt;explicit typing&lt;/em&gt;, which encourages programmers to declare the data type of variables when they are first defined.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python: Type hinting capabilities introduced since version 3.5 in 2015, and enhanced in version 3.12 on 2022.&lt;/li&gt;
&lt;li&gt;PHP: Declared types introduced in version 7 in 2015.&lt;/li&gt;
&lt;li&gt;JavaScript: Extended by the release of TypeScript in 2012 defined as "JavaScript with syntax for types".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this shift?
&lt;/h2&gt;

&lt;p&gt;Dynamically typed languages such as Python, PHP, and JavaScript are designed to let the interpreter imply automatically the type of variables during the runtime:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# In python and PHP: 'y' will take the same type as 'x'
x = 3.14
y = x  // y = 3.14 (float)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, when we explicitly define the types of variables in static languages, we allow the compiler to catch the errors during the development phase before executing the program, while providing him a hint about the memory size to allocate to these variables, and the possibility of making some optimizations in the generated machine code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// C++ example: 'y' will be an integer
float x = 3.14;
int y = x;  //  y = 3 (ignored the decimal part of the number)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How explicit-typing is introduced in dynamic languages ?
&lt;/h2&gt;

&lt;p&gt;In the following example, we declare the same function using explicit and implicit typing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# using the classic syntax:
def add(x, y):
    return x + y
# using explicit typing:
def add(x: int, y:int) -&amp;gt; int:
    return x + y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;JavaScript / TypeScript:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// using the classic syntax
function add(x, y) {
    return x + y;
}
// using explicit typing
function add(x: number, y: number): number {
    return x + y;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PHP:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// using the classic syntax:
function add($x, $y) {
    return $x + $y;
}
// using explicit typing:
function add(int $x, int $y): int {
    return $x + $y;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Where is the irony ?
&lt;/h2&gt;

&lt;p&gt;Don’t take this article as an objection to these new features, I do acknowledge the advantages of using strictly typed languages. However, &lt;strong&gt;using type annotations in Python, for example, doesn’t stop you from changing the types of your variables:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x: int = 0
x = "John" 
print(type(x))   # &amp;lt;class 'str'&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's because these languages are built that way: &lt;strong&gt;they are "dynamically typed" by definition&lt;/strong&gt;. Which means they don't enforce variables to keep the same type, at least not by default.&lt;/p&gt;

&lt;p&gt;In PHP, you can ask your interpreter to be more rigid by setting '&lt;em&gt;strict_types&lt;/em&gt;' to &lt;em&gt;true&lt;/em&gt;. This way, it won't allow changing the data types during runtime:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;declare(strict_types=1);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While in python, you can use the '&lt;em&gt;mypy&lt;/em&gt;' package to analyze your code and catch the bugs during the developemnt phase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mypy program.py
error: Incompatible types in assignment (expression has type "str", variable has type "int")  [assignment]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see 'mypy' as an advisor telling you what you did wrong, but it doesn't stop you from executing your code at your risk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fch6j30zk60alv8wzsu61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fch6j30zk60alv8wzsu61.png" alt="Image: If I wouldn't do that if I were you" width="749" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But what if I don't want to restrict my variables to one type only?&lt;/p&gt;

&lt;p&gt;A new feature lets you reduce the list of accepted types for a variable by using the union operator. The following example shows how to do it in the 3 cited languages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;y: int | float = f(x)   # introduced in Python 3.10
int | float $y = f($x)  // introduced in PHP 8.0
let y: number | string  // typescript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Are we sacrificing code readability?
&lt;/h2&gt;

&lt;p&gt;Let’s look at an example function that prints the items of a dictionary. Here’s the initial version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def print_attributes(**kwargs):
    for key, value in kwargs.items():
        print(key, value)

person = {"name": "John", "height": 1.84}
print_attributes(**person)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By using the recommendations from PEP 692 introduced in Python 3.12, the code becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from typing import TypedDict, Unpack

class Person(TypedDict):   # create a class inheriting from TypedDict
    name: str                  
    height: float           

def print_attributes(**kwargs: Unpack[Person]) -&amp;gt; None:  # use the Unpack operator
    for key, value in kwargs.items():
        print(key, value)

person: Person = {"name": "John", "height": 1.84}  # create an instance of the class
print_attributes(**person)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As a result, our code doubled in size, and we had to create a class that inherits from &lt;em&gt;TypedDict&lt;/em&gt;, while using the &lt;em&gt;Unpack _operator to tell _mypy _that the received object is a _TypedDict&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Even if the new code is safer, it would take more time for python beginners to understand it compared to the previous version.&lt;/p&gt;

&lt;p&gt;But it's not just about readability; it's also about productivity. Ten years ago, I chose Python for my PhD project because of its simplicity and the ability to prototype new ideas quickly. Over time, my codebase grew larger, and updating it now with type annotations would take a long time.&lt;/p&gt;

&lt;p&gt;Fortunately, we have the freedom to apply type hinting selectively. We can use it for some parts of our code while leaving other parts unchanged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3l6yasdz72sjr1l6d9k.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3l6yasdz72sjr1l6d9k.PNG" alt="Image: Python and PHP are -and will remain, dynamic typing languages according to their respective docs" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When should we use it?
&lt;/h2&gt;

&lt;p&gt;Don’t feel pressured to rewrite your entire codebase just because you learned a new, shiny feature.&lt;/p&gt;

&lt;p&gt;These new features are like tools. My advice is to use them wisely:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use static typing in the following scenarios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When retrieving data from external sources, such as databases, libraries, and APIs.&lt;/li&gt;
&lt;li&gt;In critical parts of your code where failure is not allowed.&lt;/li&gt;
&lt;li&gt;When you are developing a large application, or even a small application that you intend to release to production.&lt;/li&gt;
&lt;li&gt;When you have an existing codebase that is prone to frequent bugs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use dynamic typing if you are:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing a prototype to quickly test an idea. In that case productivity is more important, and you'll likely run the script only once.&lt;/li&gt;
&lt;li&gt;Implementing internal logic where you have confidence that the data types of your variables remain constant. For example, computing a bunch of math equations, or executing if-else statements that have no effect on your data.&lt;/li&gt;
&lt;li&gt;Displaying data on the screen just to get a visual understanding, such as plotting charts or images.&lt;/li&gt;
&lt;li&gt;Writing automation scripts with no external inputs, such as batch running command lines on the terminal or printing data on the console.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are general recommendations, don't try to strictly follow them, only you know if they apply to your specific use cases.&lt;/p&gt;

&lt;p&gt;Keep in mind that when it comes to coding, the golden rule is always &lt;strong&gt;to avoid complicating things when it's not necessary&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>php</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
