#Day26 - Assert Statements in Python and When NOT to use them
Rahul Banerjee
Posted on April 16, 2021
Today we will discuss the assert statement in Python.
Assert statements are a great tool for debugging. Given a boolean condition, they will raise an error if the condition evaluates to False. More specifically, it raises an "AssertionError". We can also include our custom error messages.
General Syntax
# Without Error message
assert boolean Expression
#With Error message
assert boolean Expression, "Error Message"
Standard If.......else
Let's assume we have a function that calculates the Mass of an object. The Mass of an object must always be positive. We can have a check to ensure this
def calculate_mass():
# Some stuff to calculate the mass
mass = 10
if mass > 0:
pass
else:
raise Exception()
calculate_mass()
This would work fine in the above case since mass = 10 and is greater than 0. However, if we set the mass to -10, you'd see the following on the console
Traceback (most recent call last):
File "main.py", line 9, in <module>
calculate_mass()
File "main.py", line 7, in calculate_mass
raise Exception()
Exception
That's good, we have a check to ensure that the mass is always positive. I
Using Assert
The above check can be done in a single line using an assert statement.
def calculate_mass():
# Some stuff to calculate the mass
mass = -10
assert mass > 0
calculate_mass()
As you can see we needed lesser lines of code and it looks much cleaner. In the above code snippet, since the mass is negative, you'd see the following message on the console
Traceback (most recent call last):
File "main.py", line 6, in <module>
calculate_mass()
File "main.py", line 4, in calculate_mass
assert mass > 0
AssertionError
So now we have a check to ensure that the mass is always positive. That's good but if a developer were working and got an "AssertionError", how'd they know the reason for the error?
If......Else with error messages
It would be helpful to display a message that an error was raised since the mass was not positive. This would help the future you and other developers debug more efficiently.
def calculate_mass():
# Some stuff to calculate the mass
mass = -10
if mass > 0:
pass
else:
raise Exception("The mass is not positive")
calculate_mass()
If we set the mass to -10 as above, we would get the following message
Traceback (most recent call last):
File "main.py", line 9, in <module>
calculate_mass()
File "main.py", line 7, in calculate_mass
raise Exception("The mass is not positive")
Exception: The mass is not positive
We can do the above using assert as well and yup it'll still be a single line of code
Custom Error Messages with assert
Let's try to display a custom error message with assert
def calculate_mass():
# Some stuff to calculate the mass
mass = -10
assert mass > 0,"Mass is not positive"
calculate_mass()
Again, this looks much cleaner. The above code would result in the following error
def calculate_mass():
# Some stuff to calculate the mass
mass = -10
assert mass > 0,"Mass is not positive"
calculate_mass()
A couple of Gotchas with assert
Using ( ) in your expression
Consider the following code snippet
assert(10>30 , "Error Message!")
In the above assert statement, since 10 is not greater than 30, an error message should be displayed. However, notice the condition and the error message are inside brackets so essentially they form a non-empty tuple.
A non-empty tuple evaluates to True as a result irrespective of the content inside the tuple, the assert statement will never raise an error. In python 3.8.8, the following error message will be shown in the console if use brackets with assert.
main.py:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?
assert(10>30 , "Error Message!")
Command Line Flags
assert 10>30, "Error Message!"
print("No Errors")
If you have your code in a file called "main.py", to run the file using the command line, you could type the following command
python main.py
After running the above code, an AssertError would be shown in the console as expected. The print statement will not be executed due to the AssertError
Now, try running one of the following commands
python -O main.py
python -OO main.py
If you type one of the above commands and run it, NO Error would be raised and you'd in fact see the output of the print statement.
Passing the "O" flag or the "OO" flag tells Python to ignore the assert statements.
When NOT to use Assert Statements
- Do not use code that is in production. Anybody can run the python file with the "O" flag and effectively bypass the error checks
- Do not use assert statements instead of other Exceptions/Errors such as Value Error, Key Error etc. Read about more errors here
Posted on April 16, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
April 14, 2021