integer >= 1 == True and integer.0 == False is bad, bad, bad!!!
Steven D'Aprano
steve-REMOVE-THIS at cybersource.com.au
Mon Jul 12 23:16:31 EDT 2010
On Mon, 12 Jul 2010 19:28:28 -0600, Ian Kelly wrote:
> On Mon, Jul 12, 2010 at 6:18 PM, Steven D'Aprano
> <steve at remove-this-cybersource.com.au> wrote:
>>> I prefere to explicitly write what I want to test:
>>>
>>> if myInt <> 0:
>>
>> I would argue against that. Why do you, the coder, care about the
>> specific details of treating ints in a boolean context? The int type
>> itself knows, leave the decision to it.
>
> I think you're missing the point. He's not using ints in a boolean
> context. If it were a boolean context, he would be using bools in the
> first place.
Of course he is -- he's branching on an int (a boolean context), and
explicitly writing out the test as myInt <> 0. In fact, that test could
just as easily be written as bool(myInt), which has the benefit of being
even more explicit that you want a bool.
It's also silly. Explicitness is not always a virtue. Beginners sometimes
write things like:
s = "hello "
t = "world"
print str(s + t)
and we rightly shake our heads at the sheer n00b-ness of it. Writing the
explicit tests:
if bool(myInt):
or even:
if myInt <> 0:
are firmly in the same category. The only difference is that it is more
familiar and therefore comfortable to those who are used to languages
that don't have Python's truth-testing rules.
> What he is objecting to is the practice of testing for
> special cases of ints (i.e. 0) by treating them as bools. The specific
> details of converting ints to bools are very much relevant here; as long
> as 0 is false, it works. If -1 is false (a semantic I have actually
> seen used), then it does not.
You've seen -1 being used as false? Where? Are you still talking about
Python builtins or language semantics?
If you're about to say string.find(substring), no, absolutely not. find
does not return a true/false flag, it returns an index, with -1 the
sentinel for Not Found. This is not a flag!
In fact, one of the motivations for adding bools to Python was to avoid
people mistakenly thinking that cmp(a, b) returned a flag 0, 1 when it
actually returns a three-state -1, 0, 1. This was a common source of
errors before Python got bools.
--
Steven
More information about the Python-list
mailing list