Op 2005-12-13, Steve Holden schreef <[EMAIL PROTECTED]>: > Pierre Quentel wrote: >> Hi all, >> >> In some program I was testing if a variable was a boolean, with this >> test : if v in [True,False] >> >> My script didn't work in some cases and I eventually found that for v = >> 0 the test returned True >> >> So I changed my test for the obvious "if type(v) is bool", but I still >> find it confusing that "0 in [True,False]" returns True >> >> By the way, I searched in the documentation what "obj in list" meant and >> couldn't find a precise definition (does it test for equality or >> identity with one of the values in list ? equality, it seems) ; did I >> miss something ? >> > It actually uses the __contains__() method of the right-hand operand, > and in the case of a list that will test for equality of the left-hand > operand to one of the list elements. Since False == 0 that's why you see > what you do. > > The really interesting question your post raises, though, is "Why do you > feel it's necessary to test to see whether a variable is a Boolean?".
I can give you one example. I have written a tube class. A tube behaves like Queue but it has additional code so that it can be registed with gtk in the same way as file descriptor can be registered with io_add_watch. The way this is implemented is by registering an idle handler when the tube is not empty and removing it when the tube is empty. So I have a variable cb_src (for callback source) that can be a boolean or an integer. The possible values are False: Not registered by the user True: Registered by the user but no nternal idle callback registerd a number: gtk integer ID, from the registered idle callback handler. -- Antoon Pardon -- http://mail.python.org/mailman/listinfo/python-list