]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue 12647: Add __bool__() method to the None object.
authorRaymond Hettinger <python@rcn.com>
Thu, 28 Jul 2011 16:55:13 +0000 (09:55 -0700)
committerRaymond Hettinger <python@rcn.com>
Thu, 28 Jul 2011 16:55:13 +0000 (09:55 -0700)
Lib/test/test_descr.py
Misc/NEWS
Objects/object.c

index 4a02ec178e6c5dfadfb8fb4120eec73a435182e3..1f2039e8113cdd43074496a7bc570e476fd32cd4 100644 (file)
@@ -2068,9 +2068,6 @@ order (MRO) for bases """
         # 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))
 
         # Nasty test case for proxied objects
         class Wrapper(object):
index 1bcfb557fcac676cf293deb298d6dc786e6be1d7..083b68c005030a09cd51772d3af1446a584cf8ec 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,10 @@ Core and Builtins
 - 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.
index 05c52f15788a0e5b8a85f584e5d39f2cf1cf4804..27d7089dcf826b380bef071879d5f738b653399f 100644 (file)
@@ -1255,7 +1255,7 @@ PyObject_Dir(PyObject *obj)
 }
 
 /*
-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 @@ none_dealloc(PyObject* ignore)
     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 @@ static PyTypeObject PyNone_Type = {
     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 */