[Python-checkins] cpython: Issue 12647: Add __bool__() method to the None object.

Brett Cannon brett at python.org
Fri Jul 29 22:08:30 CEST 2011


On Thu, Jul 28, 2011 at 09:55, raymond.hettinger <python-checkins at python.org
> wrote:

> http://hg.python.org/cpython/rev/ccce01988603
> changeset:   71542:ccce01988603
> user:        Raymond Hettinger <python at 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-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-checkins
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-checkins/attachments/20110729/bedd2567/attachment.html>


More information about the Python-checkins mailing list