Being a powerful dynamic language, Python allows us to change its runtime behavior based on the state of objects it's working with.
Inspecting the state of objects is the foundation of every dynamic language, and the standard library inspect module has most of the features needed for such a case.