Re: var is None vs. var == None

2009-01-27 Thread J. Cliff Dyer

On Fri, 2009-01-23 at 19:31 -0500, Benjamin Kaplan wrote:
 
 
 On Fri, Jan 23, 2009 at 7:28 PM, Gary Herron
 gher...@islandtraining.com wrote:
 Steven D'Aprano wrote:
  On Fri, 23 Jan 2009 14:58:34 -0500, Gerald Britton wrote:
 
 
  Hi -- Some time ago I ran across a comment recommending
 using var is
  None instead of var == None (also var is not None,
 etc.)
 
 
  That entirely depends on whether you wish to test for
 something which
  *is* None or something with *equals* None. Those two things
 have
  different meanings.
 
 
 
 Actually, for None, those two things *are* the same.   If
 something
 *equals* None, it also *is* None.  This is a consequence of
 the fact
 that there is only ever one value of None anywhere in the
 system.
 
 Not if someone decided to be a PITA.
  
  class A(object) :
 ...def __eq__(self, other) :
 ...   return other is None 
 ... 
  a = A()
  a == None
 True
  a is None
 False
 
 

or slightly less PITAish:

class EqualThing(object):
def __eq__(self, other):
return True

Could be a useful sentinel value in some cases.


 
 
  I wonder, do newbies actually get the impression from
 somewhere that is
  is a synonym for ==?
 
 
 
 Yes.  Such questions pop up regularly, and are usually dealt
 with quickly.
 
 
 
 
  My own
  testing indicates that the former beats the latter by about
 30% on
  average.  Not a log for a single instruction but it can add
 up in large
  projects.
 
 
  If you have a large project where the time taken to do
 comparisons to
  None is a significant portion of the total time, I'd be very
 surprised.
 
  var is None is a micro-optimization, but that's not why we
 do it. We do
  it because usually the correct test is whether var *is* None
 and not
  merely equal to None. Any random object might happen to
 equal None
  (admittedly most objects don't), but only None is None.
 
 
 You don't have that quite right.  The only way something can
 *equal*
 None is if it *is* None.
 None is not a value an object can have, but rather it is a
 (singleton)
 object that can be referenced.  Setting something *equal* to
 None is
 accomplished by making it refer to the single None object, at
 which
 point it *is* None.
 
 Gary Herron
 
 
 
 
 --
 http://mail.python.org/mailman/listinfo/python-list
 
 --
 http://mail.python.org/mailman/listinfo/python-list

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-26 Thread Steve Holden
Terry Reedy wrote:
 Roger wrote:
 And, just for completeness, the is test is canonical precisely because
 the interpreter guarantees there is only ever one object of type None,
 so an identity test is always appropriate. Even the copy module doesn't
 create copies ...


 Does the interpreter guarantee the same for False and True bools?
 
 Yes.  Bool(x) should return one of the two existing instances.
 
 In 2.x, the *names* 'True' and 'False' can be rebound because bool is
 new and people write
 try:
   False,True
 except NameError:
   False,True = 0,1
 
 to make code back compatible.
 
I would claim that the ability to rebind True and False is a simple bug,
though one not likely to be fixed in an 2.x release. The code above
doesn't rebind True and False in interpreters that have them ...

 In 3.0, the names are keywords, just like 'None' and cannot be rebound,
 so x is True is guaranteed to answer whether x *is* the true object.
 
 Back before rebinding 'None' was prohibited, 'is None' was not
 completely guaranteed either (absent reading the rest of a file to be
 sure no rebinding would be done).
 
And that was a bug too, in this case one that *was* removed in 2.4, I
believe. Don't have 2.3 lying around just now.

Python 2.4.3 (#1, May 24 2008, 13:47:28)
[GCC 4.1.2 20070626 (Red Hat 4.1.2-14)] on linux2
Type help, copyright, credits or license for more information.
 None = 3
SyntaxError: assignment to None

regards
 Steve
-- 
Steve Holden+1 571 484 6266   +1 800 494 3119
Holden Web LLC  http://www.holdenweb.com/

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-26 Thread Terry Reedy

Steve Holden wrote:

Terry Reedy wrote:



In 2.x, the *names* 'True' and 'False' can be rebound because bool is
new and people write
try:
  False,True
except NameError:
  False,True = 0,1

to make code back compatible.


I would claim that the ability to rebind True and False is a simple bug,
though one not likely to be fixed in an 2.x release. The code above
doesn't rebind True and False in interpreters that have them ...


In pre-bool 2.x, people never wrote the above but sometime wrote
  False,True = 0,1

To me it is hardly a bug to not gratuitously break substantial amounts 
of proper code.



Back before rebinding 'None' was prohibited, 'is None' was not
completely guaranteed either (absent reading the rest of a file to be
sure no rebinding would be done).


And that was a bug too, in this case one that *was* removed in 2.4, I
believe. Don't have 2.3 lying around just now.


Unlike with True and False, the devs could not think of or find any 
proper use case for rebinding None and judged that the new prohibition 
would break very little if any code.  As far as I know, they were correct.


tjr

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-26 Thread Steve Holden
Terry Reedy wrote:
 Steve Holden wrote:
 Terry Reedy wrote:
 
 In 2.x, the *names* 'True' and 'False' can be rebound because bool is
 new and people write
 try:
   False,True
 except NameError:
   False,True = 0,1

 to make code back compatible.

 I would claim that the ability to rebind True and False is a simple bug,
 though one not likely to be fixed in an 2.x release. The code above
 doesn't rebind True and False in interpreters that have them ...
 
 In pre-bool 2.x, people never wrote the above but sometime wrote
   False,True = 0,1
 
Right. This is the use case I overlooked.

 To me it is hardly a bug to not gratuitously break substantial amounts
 of proper code.
 
I quite agree. I take it all back!

 Back before rebinding 'None' was prohibited, 'is None' was not
 completely guaranteed either (absent reading the rest of a file to be
 sure no rebinding would be done).

 And that was a bug too, in this case one that *was* removed in 2.4, I
 believe. Don't have 2.3 lying around just now.
 
 Unlike with True and False, the devs could not think of or find any
 proper use case for rebinding None and judged that the new prohibition
 would break very little if any code.  As far as I know, they were correct.
 
Indeed they were.

regards
 Steve
-- 
Steve Holden+1 571 484 6266   +1 800 494 3119
Holden Web LLC  http://www.holdenweb.com/

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-25 Thread Roger
 And, just for completeness, the is test is canonical precisely because
 the interpreter guarantees there is only ever one object of type None,
 so an identity test is always appropriate. Even the copy module doesn't
 create copies ...


Does the interpreter guarantee the same for False and True bools?
--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-25 Thread Roger
 Why do you think it matters?

Intellectual curiosity hence why I asked the question.  It doesn't
matter if I know why the sky is blue but it's interesting to know
regardless.

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-25 Thread Terry Reedy

Roger wrote:

And, just for completeness, the is test is canonical precisely because
the interpreter guarantees there is only ever one object of type None,
so an identity test is always appropriate. Even the copy module doesn't
create copies ...



Does the interpreter guarantee the same for False and True bools?


Yes.  Bool(x) should return one of the two existing instances.

In 2.x, the *names* 'True' and 'False' can be rebound because bool is 
new and people write

try:
  False,True
except NameError:
  False,True = 0,1

to make code back compatible.

In 3.0, the names are keywords, just like 'None' and cannot be rebound, 
so x is True is guaranteed to answer whether x *is* the true object.


Back before rebinding 'None' was prohibited, 'is None' was not 
completely guaranteed either (absent reading the rest of a file to be 
sure no rebinding would be done).


--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-24 Thread Steve Holden
Steven D'Aprano wrote:
 On Fri, 23 Jan 2009 20:33:45 -0500, Steve Holden wrote:
 
 Steven D'Aprano wrote:
 On Fri, 23 Jan 2009 14:58:34 -0500, Gerald Britton wrote:

 Hi -- Some time ago I ran across a comment recommending using var is
 None instead of var == None (also var is not None, etc.)
 That entirely depends on whether you wish to test for something which
 *is* None or something with *equals* None. Those two things have
 different meanings.

 No they don't, because the language *guarantees* the None object is a
 singleton, so anything that *equals* None *is* None.
 
 Twice in one day. Have they put funny chemicals in the water over there? 
 *wink*
 
Nope, but you know what newsgroup response propagation is like ...

 Steve, in case you missed my earlier response:
 
 class Empty:
 ... def __eq__(self, other):
 ... return not bool(other)
 ...
 e = Empty()
 e == None
 True
 e is None
 False
 
 
 An instance that compares equal to anything false doesn't strike me as 
 particularly bizarre or pathological. For instance, the Python Cookbook 
 has an implementation for the Null object pattern. The implementation 
 given compares unequal to everything, but suggests defining an 
 appropriate __eq__ if you need different behaviour.
 
Sure, my syllogism was not strictly true, hence my final quote:

 Of course there can be pathological objects with bizarre comparison
 methods. And the is test helps avoid them.

Personally I believe that the Empty class is at least slightly pathological.

regards
 Steve
-- 
Steve Holden+1 571 484 6266   +1 800 494 3119
Holden Web LLC  http://www.holdenweb.com/

--
http://mail.python.org/mailman/listinfo/python-list


var is None vs. var == None

2009-01-23 Thread Gerald Britton
Hi -- Some time ago I ran across a comment recommending using var is
None instead of var == None (also var is not None, etc.)  My own
testing indicates that the former beats the latter by about 30% on
average.  Not a log for a single instruction but it can add up in
large projects.

I'm looking for a (semi)-official statement on this, but couldn't find
one with normal googling.  Can someone please send a link?
--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Chris Rebert
On Fri, Jan 23, 2009 at 11:58 AM, Gerald Britton
gerald.brit...@gmail.com wrote:
 Hi -- Some time ago I ran across a comment recommending using var is
 None instead of var == None (also var is not None, etc.)  My own
 testing indicates that the former beats the latter by about 30% on
 average.  Not a log for a single instruction but it can add up in
 large projects.

 I'm looking for a (semi)-official statement on this, but couldn't find
 one with normal googling.  Can someone please send a link?

From http://www.python.org/dev/peps/pep-0008/ ,
2nd bullet under Programming Recommendations:

- Comparisons to singletons like None should always be done with
  'is' or 'is not', never the equality operators.


Just FYI, `is` compares object identity (pointer equality) whereas ==
checks for value equivalence (which causes a method call). This is why
it's significantly faster.
But the main reason is because it's idiomatic.

Cheers,
Chris

-- 
Follow the path of the Iguana...
http://rebertia.com
--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Steve Holden
Chris Rebert wrote:
 On Fri, Jan 23, 2009 at 11:58 AM, Gerald Britton
 gerald.brit...@gmail.com wrote:
 Hi -- Some time ago I ran across a comment recommending using var is
 None instead of var == None (also var is not None, etc.)  My own
 testing indicates that the former beats the latter by about 30% on
 average.  Not a log for a single instruction but it can add up in
 large projects.

 I'm looking for a (semi)-official statement on this, but couldn't find
 one with normal googling.  Can someone please send a link?
 
From http://www.python.org/dev/peps/pep-0008/ ,
 2nd bullet under Programming Recommendations:
 
 - Comparisons to singletons like None should always be done with
   'is' or 'is not', never the equality operators.
 
 
 Just FYI, `is` compares object identity (pointer equality) whereas ==
 checks for value equivalence (which causes a method call). This is why
 it's significantly faster.
 But the main reason is because it's idiomatic.
 
And, just for completeness, the is test is canonical precisely because
the interpreter guarantees there is only ever one object of type None,
so an identity test is always appropriate. Even the copy module doesn't
create copies ...

 import copy
 n = copy.copy(None)
 id(n)
1555754480
 id(None)
1555754480


regards
 Steve
-- 
Steve Holden+1 571 484 6266   +1 800 494 3119
Holden Web LLC  http://www.holdenweb.com/

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Jason Scheirer
On Jan 23, 12:48 pm, Roger rdcol...@gmail.com wrote:
  And, just for completeness, the is test is canonical precisely because
  the interpreter guarantees there is only ever one object of type None,
  so an identity test is always appropriate. Even the copy module doesn't
  create copies ...

 Does the interpreter guarantee the same for False and True bools?

Yes. I know that there are the PyObject* structs defined for you
Py_True, Py_False and Py_None in the C level. Confusingly enough, the
integers -5 through 257 are also singletons where the is test will
work, but any int out of that range will not.

 def copy_id(x):
... id1, id2 = id(x), id(copy.deepcopy(x))
... print Equal: %x %s %x % (id1, ('==' if id1 == id2 else '!
='), id2)
...
...
 copy_id(a())
Equal: a8fc90 != f32370
 copy_id(1)
Equal: 9559c8 == 9559c8
 copy_id(None)
Equal: 1e1da9f0 == 1e1da9f0
 copy_id(True)
Equal: 1e1c5ec4 == 1e1c5ec4
 copy_id(False)
Equal: 1e1c5eb8 == 1e1c5eb8
 copy_id(Hello)
Equal: 1058840 == 1058840
 copy_id([])
Equal: 1067030 != 10673f0

... large equal integers are not identical in memory location ...

In [34]: x = 19591
In [35]: y = 19590+1
In [36]: id(x), id(y)
Out[36]: (17937008, 17936588)

... but small ones are ...

In [40]: x = 2
In [41]: y = 1+1
In [42]: id(x), id(y)
Out[42]: (9787836, 9787836)
--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread John Machin
On Jan 24, 7:48 am, Roger rdcol...@gmail.com wrote:
  And, just for completeness, the is test is canonical precisely because
  the interpreter guarantees there is only ever one object of type None,
  so an identity test is always appropriate. Even the copy module doesn't
  create copies ...

 Does the interpreter guarantee the same for False and True bools?

Why do you think it matters? Consider the circumstances under which
you would use each of the following:
   if some_name == True:
   if some_name is True:
   if some_name:
--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Christian Heimes
Jason Scheirer schrieb:
 Yes. I know that there are the PyObject* structs defined for you
 Py_True, Py_False and Py_None in the C level. Confusingly enough, the
 integers -5 through 257 are also singletons where the is test will
 work, but any int out of that range will not.

Small ints are cached. You should use is True or is False in Python
2.x because user can overwrite the True and False objects. In Python 3.0
both True and False are truly immutable and global singletons -- and
keywords, too. The mutable nature of the name True makes a while
True: loop sightly slower than a while 1: loop, too.

Python 2.5:

 None = 1
  File stdin, line 1
SyntaxError: assignment to None
 True = 1


Python 3.0
 True = 1
  File stdin, line 1
SyntaxError: assignment to keyword
 None = 1
  File stdin, line 1
SyntaxError: assignment to keyword

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Christian Heimes
John Machin schrieb:
 On Jan 24, 7:48 am, Roger rdcol...@gmail.com wrote:
 And, just for completeness, the is test is canonical precisely because
 the interpreter guarantees there is only ever one object of type None,
 so an identity test is always appropriate. Even the copy module doesn't
 create copies ...
 Does the interpreter guarantee the same for False and True bools?
 
 Why do you think it matters? Consider the circumstances under which
 you would use each of the following:
if some_name == True:
if some_name is True:
if some_name:


The three lines translate (roughly) into:

if some_name.__eq__(True):
if id(some_name) == id(True):
if some_name.__nonzero__(): # may check for __len__() != 0, too.

In almost every case (99.99%) you want the last variant. The second variant

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Steven D'Aprano
On Fri, 23 Jan 2009 14:58:34 -0500, Gerald Britton wrote:

 Hi -- Some time ago I ran across a comment recommending using var is
 None instead of var == None (also var is not None, etc.) 

That entirely depends on whether you wish to test for something which 
*is* None or something with *equals* None. Those two things have 
different meanings.

I wonder, do newbies actually get the impression from somewhere that is 
is a synonym for ==?



 My own
 testing indicates that the former beats the latter by about 30% on
 average.  Not a log for a single instruction but it can add up in large
 projects.

If you have a large project where the time taken to do comparisons to 
None is a significant portion of the total time, I'd be very surprised.

var is None is a micro-optimization, but that's not why we do it. We do 
it because usually the correct test is whether var *is* None and not 
merely equal to None. Any random object might happen to equal None 
(admittedly most objects don't), but only None is None.



-- 
Steven
--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Benjamin Kaplan
On Fri, Jan 23, 2009 at 6:49 PM, Steven D'Aprano 
st...@remove-this-cybersource.com.au wrote:

 On Fri, 23 Jan 2009 14:58:34 -0500, Gerald Britton wrote:

  Hi -- Some time ago I ran across a comment recommending using var is
  None instead of var == None (also var is not None, etc.)

 That entirely depends on whether you wish to test for something which
 *is* None or something with *equals* None. Those two things have
 different meanings.

 I wonder, do newbies actually get the impression from somewhere that is
 is a synonym for ==?



I think it's more that teachers tell students without programming experience
always use == to test if something equals something else unless you're
checking for None, without explaining what == and is actually mean.
--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Gary Herron
Steven D'Aprano wrote:
 On Fri, 23 Jan 2009 14:58:34 -0500, Gerald Britton wrote:

   
 Hi -- Some time ago I ran across a comment recommending using var is
 None instead of var == None (also var is not None, etc.) 
 

 That entirely depends on whether you wish to test for something which 
 *is* None or something with *equals* None. Those two things have 
 different meanings.
   

Actually, for None, those two things *are* the same.   If something
*equals* None, it also *is* None.  This is a consequence of the fact
that there is only ever one value of None anywhere in the system.

 I wonder, do newbies actually get the impression from somewhere that is 
 is a synonym for ==?
   

Yes.  Such questions pop up regularly, and are usually dealt with quickly.



   
 My own
 testing indicates that the former beats the latter by about 30% on
 average.  Not a log for a single instruction but it can add up in large
 projects.
 

 If you have a large project where the time taken to do comparisons to 
 None is a significant portion of the total time, I'd be very surprised.

 var is None is a micro-optimization, but that's not why we do it. We do 
 it because usually the correct test is whether var *is* None and not 
 merely equal to None. Any random object might happen to equal None 
 (admittedly most objects don't), but only None is None.

   
You don't have that quite right.  The only way something can *equal*
None is if it *is* None.
None is not a value an object can have, but rather it is a (singleton)
object that can be referenced.  Setting something *equal* to None is
accomplished by making it refer to the single None object, at which
point it *is* None.

Gary Herron


   

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Benjamin Kaplan
On Fri, Jan 23, 2009 at 7:28 PM, Gary Herron gher...@islandtraining.comwrote:

 Steven D'Aprano wrote:
  On Fri, 23 Jan 2009 14:58:34 -0500, Gerald Britton wrote:
 
 
  Hi -- Some time ago I ran across a comment recommending using var is
  None instead of var == None (also var is not None, etc.)
 
 
  That entirely depends on whether you wish to test for something which
  *is* None or something with *equals* None. Those two things have
  different meanings.
 

 Actually, for None, those two things *are* the same.   If something
 *equals* None, it also *is* None.  This is a consequence of the fact
 that there is only ever one value of None anywhere in the system.


Not if someone decided to be a PITA.

 class A(object) :
...def __eq__(self, other) :
...   return other is None
...
 a = A()
 a == None
True
 a is None
False



  I wonder, do newbies actually get the impression from somewhere that is
  is a synonym for ==?
 

 Yes.  Such questions pop up regularly, and are usually dealt with quickly.

 
 
 
  My own
  testing indicates that the former beats the latter by about 30% on
  average.  Not a log for a single instruction but it can add up in large
  projects.
 
 
  If you have a large project where the time taken to do comparisons to
  None is a significant portion of the total time, I'd be very surprised.
 
  var is None is a micro-optimization, but that's not why we do it. We do
  it because usually the correct test is whether var *is* None and not
  merely equal to None. Any random object might happen to equal None
  (admittedly most objects don't), but only None is None.
 
 
 You don't have that quite right.  The only way something can *equal*
 None is if it *is* None.
 None is not a value an object can have, but rather it is a (singleton)
 object that can be referenced.  Setting something *equal* to None is
 accomplished by making it refer to the single None object, at which
 point it *is* None.

 Gary Herron

 
 

 --
 http://mail.python.org/mailman/listinfo/python-list

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Robert Kern

Steven D'Aprano wrote:

var is None is a micro-optimization, but that's not why we do it. We do 
it because usually the correct test is whether var *is* None and not 
merely equal to None. Any random object might happen to equal None 
(admittedly most objects don't), but only None is None.


Additionally, some objects that use rich comparisons to return other objects and not 
booleans will simply fail when compared with None. The situations where you are testing 
for None are frequently situations where you don't really know the kind of object you 
might be getting, either.


--
Robert Kern

I have come to believe that the whole world is an enigma, a harmless enigma
 that is made terrible by our own mad attempt to interpret it as though it had
 an underlying truth.
  -- Umberto Eco

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Steven D'Aprano
On Fri, 23 Jan 2009 16:28:15 -0800, Gary Herron wrote:

 If something
 *equals* None, it also *is* None.  This is a consequence of the fact
 that there is only ever one value of None anywhere in the system.
...
 The only way something can *equal* None is if it *is* None.


 class Empty:
... def __eq__(self, other):
... return not bool(other)
...
 e = Empty()
 e == None
True
 e is None
False



-- 
Steven
--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Steve Holden
Steven D'Aprano wrote:
 On Fri, 23 Jan 2009 14:58:34 -0500, Gerald Britton wrote:
 
 Hi -- Some time ago I ran across a comment recommending using var is
 None instead of var == None (also var is not None, etc.) 
 
 That entirely depends on whether you wish to test for something which 
 *is* None or something with *equals* None. Those two things have 
 different meanings.
 
No they don't, because the language *guarantees* the None object is a
singleton, so anything that *equals* None *is* None.

 I wonder, do newbies actually get the impression from somewhere that is 
 is a synonym for ==?
 
Who knows. But if they do they can easily be reeducated.
 
 
 My own
 testing indicates that the former beats the latter by about 30% on
 average.  Not a log for a single instruction but it can add up in large
 projects.
 
 If you have a large project where the time taken to do comparisons to 
 None is a significant portion of the total time, I'd be very surprised.
 
 var is None is a micro-optimization, but that's not why we do it. We do 
 it because usually the correct test is whether var *is* None and not 
 merely equal to None. Any random object might happen to equal None 
 (admittedly most objects don't), but only None is None.
 
Of course there can be pathological objects with bizarre comparison
methods. And the is test helps avoid them.

regards
 Steve
-- 
Steve Holden+1 571 484 6266   +1 800 494 3119
Holden Web LLC  http://www.holdenweb.com/

--
http://mail.python.org/mailman/listinfo/python-list


Re: var is None vs. var == None

2009-01-23 Thread Steven D'Aprano
On Fri, 23 Jan 2009 20:33:45 -0500, Steve Holden wrote:

 Steven D'Aprano wrote:
 On Fri, 23 Jan 2009 14:58:34 -0500, Gerald Britton wrote:
 
 Hi -- Some time ago I ran across a comment recommending using var is
 None instead of var == None (also var is not None, etc.)
 
 That entirely depends on whether you wish to test for something which
 *is* None or something with *equals* None. Those two things have
 different meanings.
 
 No they don't, because the language *guarantees* the None object is a
 singleton, so anything that *equals* None *is* None.

Twice in one day. Have they put funny chemicals in the water over there? 
*wink*

Steve, in case you missed my earlier response:

 class Empty:
... def __eq__(self, other):
... return not bool(other)
...
 e = Empty()
 e == None
True
 e is None
False


An instance that compares equal to anything false doesn't strike me as 
particularly bizarre or pathological. For instance, the Python Cookbook 
has an implementation for the Null object pattern. The implementation 
given compares unequal to everything, but suggests defining an 
appropriate __eq__ if you need different behaviour.



-- 
Steven
--
http://mail.python.org/mailman/listinfo/python-list