🐍 Python - Assertions
Updated at 2018-06-09 16:54
Use asserts to write down your assumptions. Only use asserts to catch bugs, they are not meant for run-time errors.
assert
does nothing if it is true.- If false, it will raise
AssertionError
exception with the given message.
assert True
assert False, 'this failed because of that'
name: str = ''
assert len(name) > 0, 'name cannot be empty'
# => AssertionError: name cannot be empty
Asserts are great because they pinpoint to the exact line of code where your assumptions were not true.
from typing import Dict
def apply_discount(product: Dict[str, float], discount: float) -> float:
price = int(product['price'] * (1.0 - discount))
assert 0 <= price <= product['price']
return price
assert apply_discount({'price': 100.0}, 0.5) == 50
assert apply_discount({'price': 100.0}, 1.0) == 0
apply_discount({'price': 100.0}, 1.05)
# => AssertionError
# Traceback:
# ...
# File "<input>", line 5, in apply_discount
# assert 0 <= price <= product['price']
# AssertionError
Don't use assertions for auth checks or data validation. You can disable assertions with -O
and -OO
command-line flags and PYTHONOPTIMIZE
environment variable. Assertions are rarely disable though.
def delete_product(product_id: int, user: User):
assert user.is_admin(), 'must be admin'
assert store.has_product(product_id), 'unknown product'
store.get_product(product_id).delete()
Source
- Python Tricks The Book, Dan Bader
- Fluent Python, Luciano Ramalho