]> granicus.if.org Git - python/commitdiff
SF patch #670423: Add missing identity tests to operator.c
authorRaymond Hettinger <python@rcn.com>
Sat, 18 Jan 2003 23:22:20 +0000 (23:22 +0000)
committerRaymond Hettinger <python@rcn.com>
Sat, 18 Jan 2003 23:22:20 +0000 (23:22 +0000)
Doc/lib/liboperator.tex
Lib/test/test_operator.py
Misc/NEWS
Modules/operator.c

index f3f09809b4cca9b8a094e7d8a4dfb54a6f515a46..7bd66ea722ea797b4b860fdc68c898eb945b6bde 100644 (file)
@@ -48,7 +48,7 @@ for more informations about rich comparisons.
 
 
 The logical operations are also generally applicable to all objects,
-and support truth tests and Boolean operations:
+and support truth tests, identity tests, and Boolean operations:
 
 \begin{funcdesc}{not_}{o}
 \funcline{__not__}{o}
@@ -64,6 +64,14 @@ otherwise.  This is equivalent to using the \class{bool}
 constructor.
 \end{funcdesc}
 
+\begin{funcdesc}{is_}{a, b}
+Return \code{\var{a} is \var{b}}.  Tests object identity.
+\end{funcdesc}
+
+\begin{funcdesc}{is_not}{a, b}
+Return \code{\var{a} is not \var{b}}.  Tests object identity.
+\end{funcdesc}
+
 
 The mathematical and bitwise operations are the most numerous:
 
index 611e4277ff396a461bfac3b0eccc3dc0474322a5..422a3cb74aa8d2a921bfdee61427ce408105d915 100644 (file)
@@ -215,6 +215,17 @@ class OperatorTestCase(unittest.TestCase):
     def test_bitwise_xor(self):
         self.failUnless(operator.xor(0xb, 0xc) == 0x7)
 
+    def test_is(self):
+        a = b = 'xyzpdq'
+        c = a[:3] + b[3:]
+        self.failUnless(operator.is_(a, b))
+        self.failIf(operator.is_(a,c))
+
+    def test_is_not(self):
+        a = b = 'xyzpdq'
+        c = a[:3] + b[3:]
+        self.failIf(operator.is_not(a, b))
+        self.failUnless(operator.is_not(a,c))
 
 def test_main():
     test_support.run_unittest(OperatorTestCase)
index 30b49022ca8d45691b8f4ef7d61bc3ef881d0d18..349712fb2ccb95f32e335f123fe92b2c25011b22 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -517,6 +517,11 @@ Core and builtins
 Extension modules
 -----------------
 
+- Added three operators to the operator module:
+    operator.pow(a,b) which is equivalent to:  a**b.
+    operator.is_(a,b) which is equivalent to:  a is b.
+    operator.is_not(a,b) which is equivalent to:  a is not b.
+
 - posix.openpty now works on all systems that have /dev/ptmx.
 
 - A module zipimport exists to support importing code from zip
@@ -733,8 +738,6 @@ Library
   or when you need to use sets as dict keys, and a class BaseSet which
   is the base class of the two.
 
-- Added operator.pow(a,b) which is equivalent to a**b.
-
 - Added random.sample(population,k) for random sampling without replacement.
   Returns a k length list of unique elements chosen from the population.
 
index 5371b95a1cbd4108f32546ab159a7f1eb802a3ff..7638fb80a13cc691a931eb8bc6f20873c317753b 100644 (file)
@@ -107,6 +107,28 @@ op_pow(PyObject *s, PyObject *a)
        return NULL;
 }
 
+static PyObject*
+is_(PyObject *s, PyObject *a)
+{
+       PyObject *a1, *a2, *result = NULL;
+       if (PyArg_UnpackTuple(a,"is_", 2, 2, &a1, &a2)) {
+               result = (a1 == a2) ? Py_True : Py_False;
+               Py_INCREF(result);
+       }
+       return result;
+}
+
+static PyObject*
+is_not(PyObject *s, PyObject *a)
+{
+       PyObject *a1, *a2, *result = NULL;
+       if (PyArg_UnpackTuple(a,"is_not", 2, 2, &a1, &a2)) {
+               result = (a1 != a2) ? Py_True : Py_False;
+               Py_INCREF(result);
+       }
+       return result;
+}
+
 static PyObject*
 op_getslice(PyObject *s, PyObject *a)
 {
@@ -182,6 +204,8 @@ spam1(countOf,
 spam1o(isMappingType,
  "isMappingType(a) -- Return True if a has a mapping type, False otherwise.")
 
+spam1(is_, "is_(a, b) -- Same as a is b.")
+spam1(is_not, "is_not(a, b) -- Same as a is not b.")
 spam2(add,__add__, "add(a, b) -- Same as a + b.")
 spam2(sub,__sub__, "sub(a, b) -- Same as a - b.")
 spam2(mul,__mul__, "mul(a, b) -- Same as a * b.")