Assertions, combined with highly granular code coverage (which most [all?] Python coverage libraries can only do at a line level, so this isn't really sufficient), can almost get you to a point where you're confident that all your asserted invariants are true for all inputs.
Statically checking/proving that those invariants will hold, regardless of inputs, is a huge step up in that level of confidence.
Statically checking/proving that those invariants will hold, regardless of inputs, is a huge step up in that level of confidence.