If you are new to Python, you may have heard of type checking and type hinting, and wondered what they are all about. Within this post we will provide a 101 to explain what type checking and type hinting are and the problem they look to solve.
Let's dive in,
Python is a dynamically typed language. Dynamic means the variable type is not declared when assigning the variable. Instead, variable types are checked at runtime.
Why does this matter? Well, let's take an example. In Python, we set the variable
vlan_id, for which we assign a string value of
100. Along with this, we also create a function to perform an action to this variable, such as increment the value by 1:
vlan_id = "100" def add_vlan(vlan_id): return vlan_id + 1
However, if we now call our function, at runtime we will get an error as we are trying to add an integer (number) to a string. In other words, our variable
vlan_id should have been assigned an integer-based value instead of a string-based value.
>>> add_vlan(vlan_id) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in add_vlan TypeError: can only concatenate str (not "int") to str
So what can we do to prevent issues such as this? Well Python provides what is known as type hinting.
Type hinting allows us to hint (annotate) at what the type of a value should be.
Here's an example where we are hinting that the
vlan_id should be an
int, both at the point of assignment and also when being supplied as the function input.
vlan_id: int = "100" def add_vlan(vlan_id: int): return vlan_id + 1 ...
However, even though we have added type hints, we've only solved half the issue. Our type hints are only, well, a hint - an annotation on what the types "should" be. And, like before, the type checking will only occur at runtime. Therefore, in this case our code will still fail.
This is where we require a type checker such as mypy, which will parse these type hints and report any issues prior to runtime.
Lets now look at a quick example of checking our type hints with mypy.
# Install mypy $ poetry add -D mypy
We can now run mypy on our file (shown below). As a result, we will get the expected issue that the variable we have assigned to
vlan_id is of the wrong type. Good stuff!
$ mypy 003_type_checking/001_mypy_issues.py 003_type_checking/001_mypy_issues.py:1: error: Incompatible types in assignment (expression has type "str", variable has type "int") Found 1 error in 1 file (checked 1 source file)
If you have enjoyed or found this useful, check out our new course -- Automating Python Code Quality.