True inconsistency in Python
Ron Adam
radam2 at tampabay.rr.com
Mon Nov 17 12:40:20 EST 2003
On Mon, 17 Nov 2003 00:19:11 -0800, Erik Max Francis <max at alcyone.com>
wrote:
>Tim Roberts wrote:
>
>> Python is certainly not the only language in which this occurs. Many
>> are
>> the C programmers who have been burned by:
>>
>> int SomeFunction();
>> ...
>> if( SomeFunction == TRUE )
>> {
>> }
>
>I think you're getting burned by something else, there :-).
>
>> Visual Basic has exactly the same problem.
>
>It's not a problem, explicitly comparison with a Boolean literal,
>whether or not Booleans are not distinct types (Lisp, C89), are distinct
>types with implicit conversion (C++, Python), or are distinct types in
>which implicit conversions are disallowed (Java) is completely
>superfluous. The proper way to test whether an expression is true is
>
> if (expression)
> ...
To me the usefulness of using True and False is that it is defined to
values consistent with the programming language that you are using.
So using them to assign x = True, or x = False. insures that when I
do:
x = True
if x:
....
So I get consistent results for the language and platform I'm using
now and in the future. If down the road someone decided to make True
= 3, and False = -5, and they change the language so that any boolean
comparisons return 3 and -5 respectively, my use of True and False
will still work. If I tested for 1 or 0 using the 'if x:' method,
then my program will break.
x = 1
if x: # returned value undefined, x is not 3 or -5
So I do an explicit test 'if (x=1)' to make sure it will work even if
'True' gets redefined.
So we should either use explicit comparisons of values, or use only
True and False, but not mix them.
>
>What is the point of the explicit test with the true constant? What
>about the result of _that_ comparison, shouldn't that be tested with
>true as well -- ((expression == TRUE) == TRUE)? But what about _that_
>result, shouldn't it be tested too?
>
>Explicit comparison with the true constant (or false constant)
>necessarily degenerates into complete uselessness.
>
>> Further, until very
>> recently,
>> True in VB actually evaulated to -1, so even comparing to "1" would
>> fail.
>
>That's because in traditional BASIC, "true" is all-bits on. The true
>constant wasn't 1 in the first place.
>
>> >Assuming the old behavior is desired, programmers need to be careful
>> >not to compare a variable with True as in:
>> >
>> >if var == True: # only works if var is 1
>> > blah
>>
>> Your statement is absolutely true. End of story.
>
>It's true in that that might cause a problem, but it's not true that
>that's undesirable language behavior. It's programmer error -- in any
>language that has a Boolean true (or false) literal.
It looks to me that 'True' in python is a combination of the boolean
binary logic of 1 or 0, and as an "exists" test of 0 or not 0.
If python had an exists operator, you could do.
if x exists:
'do something'
This could serve two options also... does the object exist? or does
a value exist where the value is not equal to zero or None. There
would need to be a syntax difference between the two.
Using the 'if x:' form does this for values and is clear enough. So
using an 'exists()' function to check for the presence of an object
would be useful if there isn't a simple way to do it already. Right
now it you do this without first assigning a value to x you get:
>>> if x:
pass
Traceback (most recent call last):
File "<pyshell#2>", line 1, in -toplevel-
if x:
NameError: name 'x' is not defined
>>>
There is an os.path.exists() function for checking if a file path
exists. A more general exists() function or method my be useful and
still be consistent with it.
With pythons dynamic variables, I think an exists function would be
useful to check if an object exists. And to use 'if x:' to check if
a (value!=0) exists. It's clear what is being tested for from the
context.
I can't do:
def exists(object):
try object:
return True
return False
if not exists(object):
object = 0
This generates a not defined error if object isn't defined when exists
is called.
So I have to do:
try:
if object:
exist = True
except:
exist = False
if not exist:
object = 0
That can be shortened to:
try:
if object:
pass
except:
object = 0
This isn't to bad, but I would prefer something like,
if not object.exists: # does the abject already exist?
object = 0 # if not, create and set initial value
# else use the existing value
I think I diverged from True or False a bit here. And I'm not sure if
this functionality already exists or not?
_Ron Adam
There's probably a way to do this in python already.
More information about the Python-list
mailing list