On Thu, Jul 28, 2011 at 09:55, raymond.hettinger <python-check...@python.org > wrote:
> http://hg.python.org/cpython/rev/ccce01988603 > changeset: 71542:ccce01988603 > user: Raymond Hettinger <pyt...@rcn.com> > date: Thu Jul 28 09:55:13 2011 -0700 > summary: > Issue 12647: Add __bool__() method to the None object. > > files: > Lib/test/test_descr.py | 3 - > Misc/NEWS | 4 ++ > Objects/object.c | 46 ++++++++++++++++++++++++++++- > 3 files changed, 48 insertions(+), 5 deletions(-) > > > diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py > --- a/Lib/test/test_descr.py > +++ b/Lib/test/test_descr.py > @@ -2068,9 +2068,6 @@ > # Two essentially featureless objects, just inheriting stuff from > # object. > self.assertEqual(dir(NotImplemented), dir(Ellipsis)) > - if support.check_impl_detail(): > - # None differs in PyPy: it has a __nonzero__ > - self.assertEqual(dir(None), dir(Ellipsis)) > > Wasn't this change only in 3.3 where __nonzero__ doesn't exist? So when PyPy eventually supports Python 3 they will have to update to support __bool__ on None but this test won't exercise that for them. IOW I think the guard is wrong and should go. -Brett > # Nasty test case for proxied objects > class Wrapper(object): > diff --git a/Misc/NEWS b/Misc/NEWS > --- a/Misc/NEWS > +++ b/Misc/NEWS > @@ -13,6 +13,10 @@ > - Verify the types of AST strings and identifiers provided by the user > before > compiling them. > > +- Issue #12647: The None object now has a __bool__() method that returns > False. > + Formerly, bool(None) returned False only because of special case logic > + in PyObject_IsTrue(). > + > - Issue #12579: str.format_map() now raises a ValueError if used on a > format string that contains positional fields. Initial patch by > Julian Berman. > diff --git a/Objects/object.c b/Objects/object.c > --- a/Objects/object.c > +++ b/Objects/object.c > @@ -1255,7 +1255,7 @@ > } > > /* > -None is as a non-NULL undefined value. > +None is a non-NULL undefined value. > There is (and should be!) no way to create other objects of this type, > so there is exactly one (which is indestructible, by the way). > */ > @@ -1277,6 +1277,48 @@ > Py_FatalError("deallocating None"); > } > > +static int > +none_bool(PyObject *v) > +{ > + return 0; > +} > + > +static PyNumberMethods none_as_number = { > + 0, /* nb_add */ > + 0, /* nb_subtract */ > + 0, /* nb_multiply */ > + 0, /* nb_remainder */ > + 0, /* nb_divmod */ > + 0, /* nb_power */ > + 0, /* nb_negative */ > + 0, /* nb_positive */ > + 0, /* nb_absolute */ > + (inquiry)none_bool, /* nb_bool */ > + 0, /* nb_invert */ > + 0, /* nb_lshift */ > + 0, /* nb_rshift */ > + 0, /* nb_and */ > + 0, /* nb_xor */ > + 0, /* nb_or */ > + 0, /* nb_int */ > + 0, /* nb_reserved */ > + 0, /* nb_float */ > + 0, /* nb_inplace_add */ > + 0, /* nb_inplace_subtract */ > + 0, /* nb_inplace_multiply */ > + 0, /* nb_inplace_remainder */ > + 0, /* nb_inplace_power */ > + 0, /* nb_inplace_lshift */ > + 0, /* nb_inplace_rshift */ > + 0, /* nb_inplace_and */ > + 0, /* nb_inplace_xor */ > + 0, /* nb_inplace_or */ > + 0, /* nb_floor_divide */ > + 0, /* nb_true_divide */ > + 0, /* nb_inplace_floor_divide */ > + 0, /* nb_inplace_true_divide */ > + 0, /* nb_index */ > +}; > > static PyTypeObject PyNone_Type = { > PyVarObject_HEAD_INIT(&PyType_Type, 0) > @@ -1289,7 +1331,7 @@ > 0, /*tp_setattr*/ > 0, /*tp_reserved*/ > none_repr, /*tp_repr*/ > - 0, /*tp_as_number*/ > + &none_as_number, /*tp_as_number*/ > 0, /*tp_as_sequence*/ > 0, /*tp_as_mapping*/ > 0, /*tp_hash */ > > -- > Repository URL: http://hg.python.org/cpython > > _______________________________________________ > Python-checkins mailing list > python-check...@python.org > http://mail.python.org/mailman/listinfo/python-checkins > >
_______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com