assert versus print [was Re: The curious behavior of integer objects]
Ron Adam
rrr at ronadam.com
Mon Jan 15 22:01:35 EST 2007
Calvin Spealman wrote:
> On 1/15/07, Steven D'Aprano <steve at removeme.cybersource.com.au> wrote:
>> On Mon, 15 Jan 2007 17:50:56 -0500, Calvin Spealman wrote:
>>
>>> assert foo(0x10) == 0 # Assertions are much better tests than prints :-)
>> I dispute that assertion (pun intended).
>
> Hah!
>
>> Firstly, print statements work even if you pass the -O (optimize) flag
>> to Python. Your asserts don't.
>
> This is true, but the concept can be adapted to a things like an
> assert_() function.
>
>> Secondly, a bare assertion like that gives you very little information: it
>> just tells you that it failed:
>>
>>>>> x = 1
>>>>> assert x == 0
>> Traceback (most recent call last):
>> File "<stdin>", line 1, in ?
>> AssertionError
>>
>> To provide the same information that print provides, you need something
>> like this:
>>
>> assert x == 0, "x == %s not 0" % x
>
> What information would I need to know if my test passed? Nothing, I
> say. I only want to know when the tests fail, especially as I add more
> of them. Having no output is a great way to know nothing puked.
>
>> Thirdly, and most importantly, assert and print aren't alternatives,
>> but complementary tools. Assertions are good for automated testing and
>> simple data validation, where you already know what values you should
>> have. Printing is good for interactively exploring your data when you're
>> uncertain about the values you might get: sometimes it is hard to know
>> what you should be asserting until you've seen what results your function
>> returns.
>
> True, but I intended my statement as a nudge towards more proper
> testing. Even when testing things out, I often use an assert rather
> than a print, to verify some condition.
There have been times where I would like assert to be a little more assertive
than it is. :-)
ie.. not being able to turn them off with the -0/-00 switches, and having them
generate a more verbose traceback.
Maybe have an alternative 'warn' as an alternative debugging version that could
be set to ignore, soft (print to log), and hard (raise an error).
An assert statement is a little clearer than an if...raise... in cases where you
want to raise a value exception of some type. But I'm probably in the minority
on this one.
Ron
More information about the Python-list
mailing list