Why assert is not a function?

Cameron Simpson cs at cskk.id.au
Thu Mar 11 23:52:15 EST 2021


On 12Mar2021 12:53, DL Neil <PythonList at DancesWithMice.info> wrote:
>On 12/03/2021 11.27, Chris Angelico wrote:
>> On Fri, Mar 12, 2021 at 9:10 AM Ethan Furman <ethan at stoneleaf.us> wrote:
>>> On 3/11/21 1:45 PM, dn via Python-list wrote:
>>>> Is assert so much faster/cheaper than try...except...raise?
>>>
>>> Infinitely faster when they are not there.  ;-)
[...]
>> There are many hybrids available too though. For instance:
>>
>> if __debug__ or args.verify:
>>     def verify(thing):
>>         ...
>>         raise Whatever
>> else:
>>     def verify(thing): pass
>>
>> Yes, you pay the price of a function call even if you're not verifying
>> the full structural integrity. But that's a lot cheaper than the full
>> check.
>>
>> Advantage here is that you can use -O to suppress, or you can control
>> it with an arg, or whatever.
>>
>> If you're doing the same check in lots of places, and it's costly,
>> assertions aren't really a great fit.
>
>Perhaps I misunderstood (and haven't gone back to check - mea culpa),
>but the impression-gained was that -O many not be used, even "in
>production", for some reason?

News to me. Perhaps that was someone's scenario.

To me, asserts have 2 primary features: (a) they're easy to write (and 
read) versus "if some_test: raise SomeException("blah blah...")" and (b) 
they are outright _absent_ from the code when run with -O.

_Provided_ the code called from the assert has no side effects, dropping 
the asserts should always make for identical -O behaviour vs no -O.

Chris' example above walks the middle ground providing something richer 
that a plain assert while still (almost) vanishing with -O (and no 
args.verify mode switch).

>Perhaps because I've not come from a language where assert played any/a
>major rôle, but am still hoping for some discussion/understanding as to
>why/when assert might be better than try...except in every/particular
>situations...

I find assert visually low impact. Try/except is quite wordy and brings 
more indentation.

One has to keep in mind the use case.

For me, try/except is for when something might reasonably "go wrong" in 
normal use, even niche normal use. Whereas assert is for things which 
should _never_ occur. Roughly, again for me, try/except if for catching 
misuse and assert is for catching misdesign/misimplementation.

Cheers,
Cameron Simpson <cs at cskk.id.au>


More information about the Python-list mailing list