]> granicus.if.org Git - python/commitdiff
- patch #1600346 submitted by Tomer Filiba
authorJack Diederich <jackdied@gmail.com>
Tue, 28 Nov 2006 19:15:13 +0000 (19:15 +0000)
committerJack Diederich <jackdied@gmail.com>
Tue, 28 Nov 2006 19:15:13 +0000 (19:15 +0000)
- Renamed nb_nonzero slots to nb_bool
- Renamed __nonzero__ methods to __bool__
- update core, lib, docs, and tests to match

31 files changed:
Demo/classes/Complex.py
Demo/classes/Rat.py
Doc/lib/liboperator.tex
Doc/lib/libstdtypes.tex
Doc/lib/libtimeit.tex
Doc/lib/libwinreg.tex
Doc/lib/libxmlrpclib.tex
Doc/ref/ref3.tex
Include/object.h
Lib/decimal.py
Lib/test/test_bool.py
Lib/test/test_builtin.py
Lib/test/test_decimal.py
Lib/test/test_descr.py
Lib/test/test_iter.py
Lib/test/test_operator.py
Lib/test/test_richcmp.py
Lib/xml/dom/minidom.py
Misc/NEWS
Modules/_ctypes/_ctypes.c
Modules/datetimemodule.c
Objects/boolobject.c
Objects/complexobject.c
Objects/floatobject.c
Objects/intobject.c
Objects/longobject.c
Objects/object.c
Objects/setobject.c
Objects/typeobject.c
Objects/weakrefobject.c
PC/_winreg.c

index a77989750f98d693310ebaf3a287d0b6c64bfa2c..2019cdf32d9bf7f7a03485c687039619461c5435 100755 (executable)
@@ -165,7 +165,7 @@ class Complex:
         other = ToComplex(other)
         return cmp(other, self)
 
-    def __nonzero__(self):
+    def __bool__(self):
         return not (self.re == self.im == 0)
 
     abs = radius = __abs__
index 55543b6d2d249391b6da9e6c0c9e0c4e887c1ef1..24670b616b31ef7f742e7cdbfceb9447d70eee54 100755 (executable)
@@ -223,7 +223,7 @@ class Rat:
         return cmp(Rat(a), b)
 
     # a != 0
-    def __nonzero__(a):
+    def __bool__(a):
         return a.__num != 0
 
     # coercion
index 5ba3209be010fa184255679ed602339a1ff2743a..867c2ab4c294fa1d87f320dfc9857e45b14a2712 100644 (file)
@@ -55,7 +55,7 @@ and support truth tests, identity tests, and boolean operations:
 Return the outcome of \keyword{not} \var{o}.  (Note that there is no
 \method{__not__()} method for object instances; only the interpreter
 core defines this operation.  The result is affected by the
-\method{__nonzero__()} and \method{__len__()} methods.)
+\method{__bool__()} and \method{__len__()} methods.)
 \end{funcdesc}
 
 \begin{funcdesc}{truth}{o}
index d5409e03277e201538cfb3b3b4e6203dc634fd05..17e377beb865aa29a98d1aec786e512317b57283 100644 (file)
@@ -51,7 +51,7 @@ The following values are considered false:
 \item  any empty mapping, for example, \code{\{\}}.
 
 \item  instances of user-defined classes, if the class defines a
-        \method{__nonzero__()} or \method{__len__()} method, when that
+        \method{__bool__()} or \method{__len__()} method, when that
         method returns the integer zero or \class{bool} value
         \code{False}.\footnote{Additional 
 information on these special methods may be found in the
index 1c4e05bafd4682c24e28276c9b787de32f441682..2629439d8ccc3a2e61c3d7559ef57c5dcb547f99 100644 (file)
@@ -162,13 +162,13 @@ the module interface) that compare the cost of using
 missing and present object attributes.
 
 \begin{verbatim}
-% timeit.py 'try:' '  str.__nonzero__' 'except AttributeError:' '  pass'
+% timeit.py 'try:' '  str.__bool__' 'except AttributeError:' '  pass'
 100000 loops, best of 3: 15.7 usec per loop
-% timeit.py 'if hasattr(str, "__nonzero__"): pass'
+% timeit.py 'if hasattr(str, "__bool__"): pass'
 100000 loops, best of 3: 4.26 usec per loop
-% timeit.py 'try:' '  int.__nonzero__' 'except AttributeError:' '  pass'
+% timeit.py 'try:' '  int.__bool__' 'except AttributeError:' '  pass'
 1000000 loops, best of 3: 1.43 usec per loop
-% timeit.py 'if hasattr(int, "__nonzero__"): pass'
+% timeit.py 'if hasattr(int, "__bool__"): pass'
 100000 loops, best of 3: 2.23 usec per loop
 \end{verbatim}
 
@@ -176,7 +176,7 @@ missing and present object attributes.
 >>> import timeit
 >>> s = """\
 ... try:
-...     str.__nonzero__
+...     str.__bool__
 ... except AttributeError:
 ...     pass
 ... """
@@ -184,14 +184,14 @@ missing and present object attributes.
 >>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
 17.09 usec/pass
 >>> s = """\
-... if hasattr(str, '__nonzero__'): pass
+... if hasattr(str, '__bool__'): pass
 ... """
 >>> t = timeit.Timer(stmt=s)
 >>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
 4.85 usec/pass
 >>> s = """\
 ... try:
-...     int.__nonzero__
+...     int.__bool__
 ... except AttributeError:
 ...     pass
 ... """
@@ -199,7 +199,7 @@ missing and present object attributes.
 >>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
 1.97 usec/pass
 >>> s = """\
-... if hasattr(int, '__nonzero__'): pass
+... if hasattr(int, '__bool__'): pass
 ... """
 >>> t = timeit.Timer(stmt=s)
 >>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
index d1e23da51cb7cd3e1717209c6574c322f0712b02..385399778456347df24b56f982e7bbd91d5af35c 100644 (file)
@@ -375,7 +375,7 @@ This module offers the following functions:
  also accept an integer, however, use of the handle object is 
  encouraged.
  
- Handle objects provide semantics for \method{__nonzero__()} - thus
+ Handle objects provide semantics for \method{__bool__()} - thus
 \begin{verbatim}
     if handle:
         print "Yes"
index 3645b824d8641c1323ade0d0b93230e301787b22..b08920ccb1374f7b671b672084eb52000505333f 100644 (file)
@@ -171,7 +171,7 @@ Hacks}{http://xmlrpc-c.sourceforge.net/hacks.php} page.
 This class may be initialized from any Python value; the instance
 returned depends only on its truth value.  It supports various Python
 operators through \method{__cmp__()}, \method{__repr__()},
-\method{__int__()}, and \method{__nonzero__()} methods, all
+\method{__int__()}, and \method{__bool__()} methods, all
 implemented in the obvious ways.
 
 It also has the following method, supported mainly for internal use by
index 83277f44f584e2fb86601082e9f6327b0d1bc405..7eddfcd6dc6bf625fa50b657a1225db65d12e4be 100644 (file)
@@ -1313,13 +1313,13 @@ of that object]{2.5}
 \withsubitem{(object method)}{\ttindex{__cmp__()}}
 \end{methoddesc}
 
-\begin{methoddesc}[object]{__nonzero__}{self}
+\begin{methoddesc}[object]{__bool__}{self}
 Called to implement truth value testing, and the built-in operation
-\code{bool()}; should return \code{False} or \code{True}, or their
-integer equivalents \code{0} or \code{1}.
+\code{bool()}; should return \code{False} or \code{True}.
 When this method is not defined, \method{__len__()} is
-called, if it is defined (see below).  If a class defines neither
-\method{__len__()} nor \method{__nonzero__()}, all its instances are
+called, if it is defined (see below) and \code{True} is returned when
+the length is not zero.  If a class defines neither
+\method{__len__()} nor \method{__bool__()}, all its instances are
 considered true.
 \withsubitem{(mapping object method)}{\ttindex{__len__()}}
 \end{methoddesc}
@@ -1693,9 +1693,9 @@ through the values.
 Called to implement the built-in function
 \function{len()}\bifuncindex{len}.  Should return the length of the
 object, an integer \code{>=} 0.  Also, an object that doesn't define a
-\method{__nonzero__()} method and whose \method{__len__()} method
+\method{__bool__()} method and whose \method{__len__()} method
 returns zero is considered to be false in a Boolean context.
-\withsubitem{(object method)}{\ttindex{__nonzero__()}}
+\withsubitem{(object method)}{\ttindex{__bool__()}}
 \end{methoddesc}
 
 \begin{methoddesc}[container object]{__getitem__}{self, key}
index 80447a91fab5aaaa32b546d3c6b61c83e82c7426..83a2c54b58cac956158ddba3078aae032c1cc4b4 100644 (file)
@@ -160,7 +160,7 @@ typedef struct {
        unaryfunc nb_negative;
        unaryfunc nb_positive;
        unaryfunc nb_absolute;
-       inquiry nb_nonzero;
+       inquiry nb_bool;
        unaryfunc nb_invert;
        binaryfunc nb_lshift;
        binaryfunc nb_rshift;
index 99c0de6d3285011944b8c7ae3e4b96f81312bae0..4557e6a8f1ac081de6d9d27922df0514d2f9decf 100644 (file)
@@ -633,14 +633,14 @@ class Decimal(object):
             return other
         return 0
 
-    def __nonzero__(self):
+    def __bool__(self):
         """Is the number non-zero?
 
         0 if self == 0
         1 if self != 0
         """
         if self._is_special:
-            return 1
+            return True
         return sum(self._int) != 0
 
     def __cmp__(self, other, context=None):
@@ -759,7 +759,7 @@ class Decimal(object):
         i = int(self)
         if self == Decimal(i):
             return hash(i)
-        assert self.__nonzero__()   # '-0' handled by integer case
+        assert self.__bool__()   # '-0' handled by integer case
         return hash(str(self.normalize()))
 
     def as_tuple(self):
index 97ac4809a5c389ae215cb9834a9f2a2759b86c69..8121e03e0678a35d9d5a12cad5c67915e9e466c2 100644 (file)
@@ -335,24 +335,51 @@ class BoolTest(unittest.TestCase):
 
     def test_convert_to_bool(self):
         # Verify that TypeError occurs when bad things are returned
-        # from __nonzero__().  This isn't really a bool test, but
+        # from __bool__().  This isn't really a bool test, but
         # it's related.
         check = lambda o: self.assertRaises(TypeError, bool, o)
         class Foo(object):
-            def __nonzero__(self):
+            def __bool__(self):
                 return self
         check(Foo())
 
         class Bar(object):
-            def __nonzero__(self):
+            def __bool__(self):
                 return "Yes"
         check(Bar())
 
         class Baz(int):
-            def __nonzero__(self):
+            def __bool__(self):
                 return self
         check(Baz())
 
+        # __bool__() must return a bool not an int
+        class Spam(int):
+            def __bool__(self):
+                return 1
+        check(Spam())
+
+        class Eggs:
+            def __len__(self):
+                return -1
+        self.assertRaises(ValueError, bool, Eggs())
+
+    def test_sane_len(self):
+        # this test just tests our assumptions about __len__
+        # this will start failing if __len__ changes assertions
+        for badval in ['illegal', -1, 1 << 32]:
+            class A:
+                def __len__(self):
+                    return badval
+            try:
+                bool(A())
+            except (Exception), e_bool:
+                pass
+            try:
+                len(A())
+            except (Exception), e_len:
+                pass
+            self.assertEqual(str(e_bool), str(e_len))
 
 def test_main():
     test_support.run_unittest(BoolTest)
index 272af86362117d7e6c3eb8ba1559b04d1238e20a..7b245d17d3011d62a3556f65e3db1f2d53abcbe0 100644 (file)
@@ -94,7 +94,7 @@ if have_unicode:
 ]
 
 class TestFailingBool:
-    def __nonzero__(self):
+    def __bool__(self):
         raise RuntimeError
 
 class TestFailingIter:
index 5fef4eb5cce48369f5f017a9726a6ff247fc64cb..55a53d30f7b9d482567aeccb066f7efb1f41c91e 100644 (file)
@@ -990,7 +990,7 @@ class DecimalUsabilityTest(unittest.TestCase):
         checkSameDec("__mod__", True)
         checkSameDec("__mul__", True)
         checkSameDec("__neg__")
-        checkSameDec("__nonzero__")
+        checkSameDec("__bool__")
         checkSameDec("__pos__")
         checkSameDec("__pow__", True)
         checkSameDec("__radd__", True)
index b2e7e665cc3399423fe3bcd3c0ea5b1ae2123c41..d3ae4551ab8562e34c646e416f21a813c155a7af 100644 (file)
@@ -417,8 +417,8 @@ def ints():
     if verbose: print "Testing int operations..."
     numops(100, 3)
     # The following crashes in Python 2.2
-    vereq((1).__nonzero__(), 1)
-    vereq((0).__nonzero__(), 0)
+    vereq((1).__bool__(), True)
+    vereq((0).__bool__(), False)
     # This returns 'NotImplemented' in Python 2.2
     class C(int):
         def __add__(self, other):
@@ -1682,7 +1682,7 @@ def specials():
     class Proxy(object):
         def __init__(self, x):
             self.x = x
-        def __nonzero__(self):
+        def __bool__(self):
             return not not self.x
         def __hash__(self):
             return hash(self.x)
@@ -1722,7 +1722,7 @@ def specials():
     class DProxy(object):
         def __init__(self, x):
             self.x = x
-        def __nonzero__(self):
+        def __bool__(self):
             return not not self.x
         def __hash__(self):
             return hash(self.x)
index 0ac34c8220ebfaea7738f880ead52e2820d09bb1..76af429de10ad87bf17accac64394af2dfa2b9b9 100644 (file)
@@ -327,10 +327,10 @@ class TestCase(unittest.TestCase):
         class Boolean:
             def __init__(self, truth):
                 self.truth = truth
-            def __nonzero__(self):
+            def __bool__(self):
                 return self.truth
-        bTrue = Boolean(1)
-        bFalse = Boolean(0)
+        bTrue = Boolean(True)
+        bFalse = Boolean(False)
 
         class Seq:
             def __init__(self, *args):
index 50c3b0c12ca01d93ecc4473fae373cde6e349e3d..152d5ecb895f8aae5dbc854650f58ce33a905a60 100644 (file)
@@ -319,7 +319,7 @@ class OperatorTestCase(unittest.TestCase):
 
     def test_truth(self):
         class C(object):
-            def __nonzero__(self):
+            def __bool__(self):
                 raise SyntaxError
         self.failUnlessRaises(TypeError, operator.truth)
         self.failUnlessRaises(SyntaxError, operator.truth, C())
index f412a89055cdb117b19f2215632e9d2c1bb7c3d3..9c4a7a05e611fc01193c87a73dc3f0dffb59179b 100644 (file)
@@ -51,7 +51,7 @@ class Vector:
     def __hash__(self):
         raise TypeError, "Vectors cannot be hashed"
 
-    def __nonzero__(self):
+    def __bool__(self):
         raise TypeError, "Vectors cannot be used in Boolean contexts"
 
     def __cmp__(self, other):
@@ -133,7 +133,7 @@ class VectorTest(unittest.TestCase):
 
             for ops in opmap.itervalues():
                 for op in ops:
-                    # calls __nonzero__, which should fail
+                    # calls __bool__, which should fail
                     self.assertRaises(TypeError, bool, op(a, b))
 
 class NumberTest(unittest.TestCase):
@@ -208,13 +208,13 @@ class MiscTest(unittest.TestCase):
         self.assertRaises(RuntimeError, cmp, a, b)
 
     def test_not(self):
-        # Check that exceptions in __nonzero__ are properly
+        # Check that exceptions in __bool__ are properly
         # propagated by the not operator
         import operator
         class Exc(Exception):
             pass
         class Bad:
-            def __nonzero__(self):
+            def __bool__(self):
                 raise Exc
 
         def do(bad):
index 028e809ca3267988990d317b296203d87b3a0c59..bfdcc82c025bc6ddd965abb67492a9857d2b92f8 100644 (file)
@@ -38,7 +38,7 @@ class Node(xml.dom.Node):
 
     prefix = EMPTY_PREFIX # non-null only for NS elements and attributes
 
-    def __nonzero__(self):
+    def __bool__(self):
         return True
 
     def toxml(self, encoding = None):
index 3f57fcbfeb1a62d949268580822571653bf435a8..2c37fc20dac789e7d239269911ff1abd01fc8a18 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -36,6 +36,8 @@ TO DO
 Core and Builtins
 -----------------
 
+- Renamed nb_nonzero to nb_bool and __nonzero__ to __bool__
+
 - Classic classes are a thing of the past.  All classes are new style.
 
 - Exceptions *must* derive from BaseException.
index e4aae2d10fc98216c40c85ae68f21db80df56154..7948516401b858ae54d6ff1ef19ee8c86452303e 100644 (file)
@@ -4017,7 +4017,7 @@ static PyMethodDef Simple_methods[] = {
        { NULL, NULL },
 };
 
-static int Simple_nonzero(CDataObject *self)
+static int Simple_bool(CDataObject *self)
 {
        return memcmp(self->b_ptr, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", self->b_size);
 }
@@ -4032,7 +4032,7 @@ static PyNumberMethods Simple_as_number = {
        0, /* nb_negative */
        0, /* nb_positive */
        0, /* nb_absolute */
-       (inquiry)Simple_nonzero, /* nb_nonzero */
+       (inquiry)Simple_bool, /* nb_bool */
 };
 
 #if (PY_VERSION_HEX < 0x02040000)
@@ -4364,7 +4364,7 @@ static PySequenceMethods Pointer_as_sequence = {
 };
 
 static int
-Pointer_nonzero(CDataObject *self)
+Pointer_bool(CDataObject *self)
 {
        return *(void **)self->b_ptr != NULL;
 }
@@ -4379,7 +4379,7 @@ static PyNumberMethods Pointer_as_number = {
        0, /* nb_negative */
        0, /* nb_positive */
        0, /* nb_absolute */
-       (inquiry)Pointer_nonzero, /* nb_nonzero */
+       (inquiry)Pointer_bool, /* nb_bool */
 };
 
 PyTypeObject Pointer_Type = {
index 4c05134f4f153753c3cf170323c9612fdd2ade47..b57ccbcb0092af8aca4d95654d5bae759fc1262e 100644 (file)
@@ -1958,7 +1958,7 @@ Done:
 }
 
 static int
-delta_nonzero(PyDateTime_Delta *self)
+delta_bool(PyDateTime_Delta *self)
 {
        return (GET_TD_DAYS(self) != 0
                || GET_TD_SECONDS(self) != 0
@@ -2083,7 +2083,7 @@ static PyNumberMethods delta_as_number = {
        (unaryfunc)delta_negative,              /* nb_negative */
        (unaryfunc)delta_positive,              /* nb_positive */
        (unaryfunc)delta_abs,                   /* nb_absolute */
-       (inquiry)delta_nonzero,                 /* nb_nonzero */
+       (inquiry)delta_bool,                    /* nb_bool */
        0,                                      /*nb_invert*/
        0,                                      /*nb_lshift*/
        0,                                      /*nb_rshift*/
@@ -2653,7 +2653,7 @@ static PyNumberMethods date_as_number = {
        0,                                              /* nb_negative */
        0,                                              /* nb_positive */
        0,                                              /* nb_absolute */
-       0,                                              /* nb_nonzero */
+       0,                                              /* nb_bool */
 };
 
 static PyTypeObject PyDateTime_DateType = {
@@ -3324,7 +3324,7 @@ time_replace(PyDateTime_Time *self, PyObject *args, PyObject *kw)
 }
 
 static int
-time_nonzero(PyDateTime_Time *self)
+time_bool(PyDateTime_Time *self)
 {
        int offset;
        int none;
@@ -3418,7 +3418,7 @@ static PyNumberMethods time_as_number = {
        0,                                      /* nb_negative */
        0,                                      /* nb_positive */
        0,                                      /* nb_absolute */
-       (inquiry)time_nonzero,                  /* nb_nonzero */
+       (inquiry)time_bool,                     /* nb_bool */
 };
 
 static PyTypeObject PyDateTime_TimeType = {
@@ -4501,7 +4501,7 @@ static PyNumberMethods datetime_as_number = {
        0,                                      /* nb_negative */
        0,                                      /* nb_positive */
        0,                                      /* nb_absolute */
-       0,                                      /* nb_nonzero */
+       0,                                      /* nb_bool */
 };
 
 static PyTypeObject PyDateTime_DateTimeType = {
index a0d6cd53ec727d7871fc54d2d312132909bf8320..cd194819373e3114f5dbdb516c7ec050c712b6a3 100644 (file)
@@ -112,7 +112,7 @@ static PyNumberMethods bool_as_number = {
        0,                      /* nb_negative */
        0,                      /* nb_positive */
        0,                      /* nb_absolute */
-       0,                      /* nb_nonzero */
+       0,                      /* nb_bool */
        0,                      /* nb_invert */
        0,                      /* nb_lshift */
        0,                      /* nb_rshift */
index 2713e3eeec18f03de2d9f57962330a12faf0c425..da47f8116bf71e3be308928c15499579ef2f3a2f 100644 (file)
@@ -568,7 +568,7 @@ complex_abs(PyComplexObject *v)
 }
 
 static int
-complex_nonzero(PyComplexObject *v)
+complex_bool(PyComplexObject *v)
 {
        return v->cval.real != 0.0 || v->cval.imag != 0.0;
 }
@@ -938,7 +938,7 @@ static PyNumberMethods complex_as_number = {
        (unaryfunc)complex_neg,                 /* nb_negative */
        (unaryfunc)complex_pos,                 /* nb_positive */
        (unaryfunc)complex_abs,                 /* nb_absolute */
-       (inquiry)complex_nonzero,               /* nb_nonzero */
+       (inquiry)complex_bool,                  /* nb_bool */
        0,                                      /* nb_invert */
        0,                                      /* nb_lshift */
        0,                                      /* nb_rshift */
index 40126b2a6b43abb63b862b663b8c247da304758c..aab761227497e807afa641214514a88c73981e0e 100644 (file)
@@ -837,7 +837,7 @@ float_abs(PyFloatObject *v)
 }
 
 static int
-float_nonzero(PyFloatObject *v)
+float_bool(PyFloatObject *v)
 {
        return v->ob_fval != 0.0;
 }
@@ -1087,7 +1087,7 @@ static PyNumberMethods float_as_number = {
        (unaryfunc)float_neg, /*nb_negative*/
        (unaryfunc)float_pos, /*nb_positive*/
        (unaryfunc)float_abs, /*nb_absolute*/
-       (inquiry)float_nonzero, /*nb_nonzero*/
+       (inquiry)float_bool, /*nb_bool*/
        0,              /*nb_invert*/
        0,              /*nb_lshift*/
        0,              /*nb_rshift*/
index e64d0b1f9a03f635b946c24fcdc47356abb1a78d..b420c128bde3389545b11a4bfdb3f68a2127e3b1 100644 (file)
@@ -780,7 +780,7 @@ int_abs(PyIntObject *v)
 }
 
 static int
-int_nonzero(PyIntObject *v)
+int_bool(PyIntObject *v)
 {
        return v->ob_ival != 0;
 }
@@ -1034,14 +1034,14 @@ static PyNumberMethods int_as_number = {
        (unaryfunc)int_neg,     /*nb_negative*/
        (unaryfunc)int_pos,     /*nb_positive*/
        (unaryfunc)int_abs,     /*nb_absolute*/
-       (inquiry)int_nonzero,   /*nb_nonzero*/
+       (inquiry)int_bool,      /*nb_bool*/
        (unaryfunc)int_invert,  /*nb_invert*/
        (binaryfunc)int_lshift, /*nb_lshift*/
        (binaryfunc)int_rshift, /*nb_rshift*/
        (binaryfunc)int_and,    /*nb_and*/
        (binaryfunc)int_xor,    /*nb_xor*/
        (binaryfunc)int_or,     /*nb_or*/
-       0,              /*nb_coerce*/
+       0,                      /*nb_coerce*/
        (unaryfunc)int_int,     /*nb_int*/
        (unaryfunc)int_long,    /*nb_long*/
        (unaryfunc)int_float,   /*nb_float*/
index 87082cbb01407e7a2cd0773979e2123e093bb097..566e6a7547cd98a3eada9a0de87dda2da1e585e1 100644 (file)
@@ -2886,7 +2886,7 @@ long_abs(PyLongObject *v)
 }
 
 static int
-long_nonzero(PyLongObject *v)
+long_bool(PyLongObject *v)
 {
        return ABS(v->ob_size) != 0;
 }
@@ -3307,7 +3307,7 @@ static PyNumberMethods long_as_number = {
        (unaryfunc)     long_neg,       /*nb_negative*/
        (unaryfunc)     long_pos,       /*tp_positive*/
        (unaryfunc)     long_abs,       /*tp_absolute*/
-       (inquiry)       long_nonzero,   /*tp_nonzero*/
+       (inquiry)       long_bool,      /*tp_bool*/
        (unaryfunc)     long_invert,    /*nb_invert*/
                        long_lshift,    /*nb_lshift*/
        (binaryfunc)    long_rshift,    /*nb_rshift*/
index e202e9ba0fb3240f2bc071a75bcd6502f542cfcc..4d9f414ffc8440d759f99a1021bb6e47b6cccda2 100644 (file)
@@ -1246,8 +1246,8 @@ PyObject_IsTrue(PyObject *v)
        if (v == Py_None)
                return 0;
        else if (v->ob_type->tp_as_number != NULL &&
-                v->ob_type->tp_as_number->nb_nonzero != NULL)
-               res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
+                v->ob_type->tp_as_number->nb_bool != NULL)
+               res = (*v->ob_type->tp_as_number->nb_bool)(v);
        else if (v->ob_type->tp_as_mapping != NULL &&
                 v->ob_type->tp_as_mapping->mp_length != NULL)
                res = (*v->ob_type->tp_as_mapping->mp_length)(v);
index 05549e6cfffc05646b2261d1a3450d8de1087c4b..d489711270d40dd891ae1708968d83a62089659d 100644 (file)
@@ -1784,7 +1784,7 @@ static PyNumberMethods set_as_number = {
        0,                              /*nb_negative*/
        0,                              /*nb_positive*/
        0,                              /*nb_absolute*/
-       0,                              /*nb_nonzero*/
+       0,                              /*nb_bool*/
        0,                              /*nb_invert*/
        0,                              /*nb_lshift*/
        0,                              /*nb_rshift*/
@@ -1894,7 +1894,7 @@ static PyNumberMethods frozenset_as_number = {
        0,                              /*nb_negative*/
        0,                              /*nb_positive*/
        0,                              /*nb_absolute*/
-       0,                              /*nb_nonzero*/
+       0,                              /*nb_bool*/
        0,                              /*nb_invert*/
        0,                              /*nb_lshift*/
        0,                              /*nb_rshift*/
index 074fad9b2c51caf17d262d8bf706a3bbba1c162d..ea1d1a28db91f7e704b112ca9495333f3b30bab1 100644 (file)
@@ -2928,7 +2928,7 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base)
                COPYNUM(nb_negative);
                COPYNUM(nb_positive);
                COPYNUM(nb_absolute);
-               COPYNUM(nb_nonzero);
+               COPYNUM(nb_bool);
                COPYNUM(nb_invert);
                COPYNUM(nb_lshift);
                COPYNUM(nb_rshift);
@@ -4206,32 +4206,39 @@ SLOT0(slot_nb_positive, "__pos__")
 SLOT0(slot_nb_absolute, "__abs__")
 
 static int
-slot_nb_nonzero(PyObject *self)
+slot_nb_bool(PyObject *self)
 {
        PyObject *func, *args;
-       static PyObject *nonzero_str, *len_str;
+       static PyObject *bool_str, *len_str;
        int result = -1;
+       int from_len = 0;
 
-       func = lookup_maybe(self, "__nonzero__", &nonzero_str);
+       func = lookup_maybe(self, "__bool__", &bool_str);
        if (func == NULL) {
                if (PyErr_Occurred())
                        return -1;
                func = lookup_maybe(self, "__len__", &len_str);
                if (func == NULL)
                        return PyErr_Occurred() ? -1 : 1;
+               from_len = 1;
        }
        args = PyTuple_New(0);
        if (args != NULL) {
                PyObject *temp = PyObject_Call(func, args, NULL);
                Py_DECREF(args);
                if (temp != NULL) {
-                       if (PyInt_CheckExact(temp) || PyBool_Check(temp))
+                       if (from_len) {
+                               /* enforced by slot_nb_len */
                                result = PyObject_IsTrue(temp);
+                       }
+                       else if (PyBool_Check(temp)) {
+                               result = PyObject_IsTrue(temp);
+                       }
                        else {
                                PyErr_Format(PyExc_TypeError,
-                                            "__nonzero__ should return "
-                                            "bool or int, returned %s",
-                                            temp->ob_type->tp_name);
+                                        "__bool__ should return "
+                                        "bool, returned %s",
+                                        temp->ob_type->tp_name);
                                result = -1;
                        }
                        Py_DECREF(temp);
@@ -4887,7 +4894,7 @@ static slotdef slotdefs[] = {
        UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+x"),
        UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
               "abs(x)"),
-       UNSLOT("__nonzero__", nb_nonzero, slot_nb_nonzero, wrap_inquirypred,
+       UNSLOT("__bool__", nb_bool, slot_nb_bool, wrap_inquirypred,
               "x != 0"),
        UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~x"),
        BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
index 206a45512b61bbde66020940642081bf8257ac5b..e05788fc404c6447c9b5d75f500b19042b3a009a 100644 (file)
@@ -499,7 +499,7 @@ WRAP_BINARY(proxy_ixor, PyNumber_InPlaceXor)
 WRAP_BINARY(proxy_ior, PyNumber_InPlaceOr)
 
 static int
-proxy_nonzero(PyWeakReference *proxy)
+proxy_bool(PyWeakReference *proxy)
 {
     PyObject *o = PyWeakref_GET_OBJECT(proxy);
     if (!proxy_checkref(proxy))
@@ -596,7 +596,7 @@ static PyNumberMethods proxy_as_number = {
     proxy_neg,              /*nb_negative*/
     proxy_pos,              /*nb_positive*/
     proxy_abs,              /*nb_absolute*/
-    (inquiry)proxy_nonzero, /*nb_nonzero*/
+    (inquiry)proxy_bool,    /*nb_bool*/
     proxy_invert,           /*nb_invert*/
     proxy_lshift,           /*nb_lshift*/
     proxy_rshift,           /*nb_rshift*/
index c50103332b2fdf9327edbdb89f99c620a875f7ec..bacb9ddb0ab7ce79a59975f966a221cfb91ba959 100644 (file)
@@ -305,7 +305,7 @@ PyDoc_STRVAR(PyHKEY_doc,
 "handle - The integer Win32 handle.\n"
 "\n"
 "Operations:\n"
-"__nonzero__ - Handles with an open object return true, otherwise false.\n"
+"__bool__ - Handles with an open object return true, otherwise false.\n"
 "__int__ - Converting a handle to an integer returns the Win32 handle.\n"
 "__cmp__ - Handle objects are compared using the handle value.");
 
@@ -375,7 +375,7 @@ PyHKEY_deallocFunc(PyObject *ob)
 }
 
 static int
-PyHKEY_nonzeroFunc(PyObject *ob)
+PyHKEY_boolFunc(PyObject *ob)
 {
        return ((PyHKEYObject *)ob)->hkey != 0;
 }
@@ -437,7 +437,7 @@ static PyNumberMethods PyHKEY_NumberMethods =
        PyHKEY_unaryFailureFunc,        /* nb_negative */
        PyHKEY_unaryFailureFunc,        /* nb_positive */
        PyHKEY_unaryFailureFunc,        /* nb_absolute */
-       PyHKEY_nonzeroFunc,             /* nb_nonzero */
+       PyHKEY_boolFunc,                /* nb_bool */
        PyHKEY_unaryFailureFunc,        /* nb_invert */
        PyHKEY_binaryFailureFunc,       /* nb_lshift */
        PyHKEY_binaryFailureFunc,       /* nb_rshift */